赞
踩
补充:操作系统中,有个任务调度器,将CPU时间片(比如15毫秒)分给不同的程序使用。CPU在线程间的切换速度很快,给人的感觉就是同时运行的。
并发是一个人同时吃三个馒头(一张嘴,第一个馒头吃一口,转身再吃一口第二个馒头),而并行是三个人同时吃三个馒头(三个人各吃各的,好比多核CPU各自执行指令)。
最后,并发在后端层面上,也指同一时刻,多个线程在访问同一个资源,多个线程对一个点,对应的例子: 春运抢票、电商秒杀
public class ThreadTest { public static void main(String[] args){ Thread t1 = new Thread("t1") { @Override public void run() { System.out.println("running..."); } }; t1.run(); t1.run(); t1.start(); t1.start(); }
调用两次run方法:
调用两次start方法:
JDK源码中的线程状态枚举值:
状态流转:
NEW:新建状态,创建出一个Thread对象
Runnable:可执行状态,执行start方法,此时如果抢到了CPU时间片,那就去执行run方法,然后线程进入终止状态(死亡)
Blocked:没抢不到锁(lock、synchronized),进入阻塞状态,抢到锁后切换为Runnable状态
Waiting:调用了wait方法,进入等待状态,其他线程调用notify方法后被唤醒,进入Runnable状态
Timed_Waiting:计时等待状态,线程调用了sleep方法,sleep时间过后进入Runnable状态
流转图:
thread.join();
以下,t2线程中执行t1.join
,即等待t1线程执行完成后,再执行t2
notify是随机唤醒一个wait的线程,notifyAll是唤醒所有wait的线程。
如下,object对象上wait了两个线程t1、t2
notify时,只随机唤醒了一个object对象上wait的线程
共同点:
不同点:
1)方法归属不同:
2)醒来时机不同:
wait(long time)
和 wait()
都可以被 notify 唤醒,且wait() 如果不被唤醒就一直等待3)锁的特性不同:
IllegalMonitorStateException
,sleep则不用获取任何锁加一个标记字段,改了标记之后,线程return,结束执行
class MyRun implements Runnable { boolean flag = false; public void run() { for (int i = 0; i < 100; i++) { if (! this.flag) { System.out.println(Thread.currentThread().getName() + "--->" + i); System.out.println(this.run); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } else { System.out.println("这是一些终止线程前要做的事"); System.out.println("保存数据中..终止线程成功!"); return; } } } } public class ThreadTest2 { public static void main(String[] args) { MyRun r = new MyRun(); Thread t = new Thread(r); t.start(); //sleep主线程三秒 try{ Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } //终止,改run属性为true r.run = true; } }
sleep方法已作废
MyThread myThread = new MyThread();
myThread.start();
//强制终止
myThread.stop();
public class MyInterrupt { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(()->{ System.out.println("t1 正在运行..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } }, "t1"); t1.start(); Thread.sleep(500); t1.interrupt(); System.out.println(t1.isInterrupted()); } }
public class MyInterrupt { public static void main(String[] args) throws InterruptedException { Thread t2 = new Thread(()->{ while(true) { Thread current = Thread.currentThread(); boolean interrupted = current.isInterrupted(); if(interrupted) { System.out.println("打断状态:"+ interrupted); break; } } }, "t2"); t2.start(); Thread.sleep(500); t2.interrupt(); } }
如上,主线程中调用t2.interrupt(),t2线程的中止标志位变为true,但是否中止执行,看 t2 线程自己,上面t2线程自己判断标志位为true时,就break结束循环
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。