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 }

浙公网安备 33010602011771号