JavaSE-多线程

1、实现多线程的两种方式

  注意:线程开启不代表线程立马执行,什么时候执行要看cpu什么时候调度到此线程

  实现方式1:extends Thread 

    开启线程时直接调用负类的start方法

 1 public class TestThread extends Thread{
 2     @Override
 3     public void run() {
 4         System.out.println("子线程");
 5     }
 6 
 7     //主线程
 8     public static void main(String[] args) {
 9         System.out.println("主线程");
10         //new TestThread().run();     //这并不是开启子线程,只是单纯调用run方法而已,执行后会输出”主线程“-”子线程“
11         new TestThread().start();   //这是开启子线程,执行后主线程和子线程的顺序不一定,由cpu调度
12     }
13 }

  实现方式2:implements Runnable

    开启线程时需将子线程传入Thread类,然后调用Thread类的start方法

 1 public class TestThread implements Runnable{
 2     @Override
 3     public void run() {
 4         System.out.println("子线程");
 5     }
 6 
 7     public static void main(String[] args) {
 8         System.out.println("主线程");
 9         //创建子线程对象
10         TestThread testThread = new TestThread();
11         //创建线程对象,并把子线程对象输入
12         Thread thread = new Thread(testThread);
13         //调用thread的start()方法
14         thread.start();
15         
16         //总结成一行
17         new Thread(new TestThread()).start();
18     }
19 }

    同一个对象可以同时开启多个线程

    但会存在问题:多个线程操作同一个资源的情况下,线程不安全(比如对同一个数据同时进行减操作,本来减了两次,数据应该-2,但是实际数据只-1)数据紊乱,需要线程同步

 1 public class TestThread implements Runnable{
 2     @Override
 3     public void run() {
 4         System.out.println(Thread.currentThread().getName());//获取当前线程的名字
 5         // 线程模拟延时
 6 //        try {
 7 //            Thread.sleep(200);
 8 //        } catch (InterruptedException e) {
 9 //            e.printStackTrace();
10 //        }
11     }
12 
13     public static void main(String[] args) {
14         TestThread testThread = new TestThread();
15         new Thread(testThread,"线程1").start();
16         new Thread(testThread,"线程2").start();
17         new Thread(testThread,"线程3").start();
18     }
19 }

  实现方式3:实现callable接口(了解)

2、线程实现的底层思想是静态代理

  Thread代理真实对象(即要开启的真实线程)执行start()方法,具体理解来源:a\

3、lambda表达式

4、线程同步

 

1     //同步代码块,object为需要同步的对象
2     synchronized (object){ 
3         
4     }
5     //同步方法
6     public synchronized void test(){
7         
8     }

5、线程池

ExecutorService、Executors
 1 public class TestThread implements Runnable{
 2     @Override
 3     public void run() {
 4         System.out.println(Thread.currentThread().getName());//获取当前线程的名字
 5     }
 6 
 7     public static void main(String[] args) {
 8         // 创建线程池,池中有10个线程
 9         ExecutorService service = Executors.newFixedThreadPool(10);
10         // 取出线程执行
11         service.execute(new TestThread());
12         service.execute(new TestThread());
13     }
14 }

 

posted @ 2021-11-18 10:31  一半知半  阅读(9)  评论(0)    收藏  举报