并发编程3-线程调度 短命女 2022-08-06 12:04 113阅读 0赞 ## 状态图: ## ![Center][] 方法说明: run 线程运行的主体 yield() 放弃当前的时间片进入可运行状态,可以被再次选中 start() 线程进入可运行阶段 sleep(), 阻塞一定的时间,会持有锁 t2.join() 等待t2线程运行结束,会持有锁,有可能会死锁 wait() 锁对象的方法,持有锁对象的线程释放锁,进入阻塞队列等待notify notify() 锁对象的方法,唤醒一个该锁对象阻塞队列中的线程 notifyAll() 锁对象的方法,唤醒所有该锁对象阻塞队列中的线程 ## wait , notify, notifyAll ## class SynClass{ public void execute(){ System.out.println(Thread.currentThread().getName()); } } final SynClass sc = new SynClass(); Thread[] ts = new Thread[10]; for (int i = 0; i < 10; i++) { ts[i] = new Thread("thread" + i){ public void run() { synchronized (sc) { try { sc.wait(); sc.execute(); } catch (InterruptedException e) { e.printStackTrace(); } } }; }; } for (Thread t : ts) { t.start(); } TimeUnit.SECONDS.sleep(1); synchronized (sc) { sc.notify(); sc.notify(); } while(true); 会打印: thread1 thread0 如果把其中的sc.notify()换为notifyAll()则会打印出所有的线程。 ## interrupt ## 在阻塞的方法比如wait() 或者sleep()中会有while(interruped()) throws InterruptedException()方法, interrupt()方法会设置状态为打断状态 interrupted()方法如果是打断状态返回true,同时设置打断状态为false; ## 生产者消费者 ## public class Storage { private String[] products = new String[2]; private int index = -1; public synchronized void produce(String product) throws InterruptedException{ while(index == products.length - 1){ System.out.println("超出上限无法生产"); this.wait(); } products[++index] = product; System.out.println("生产了" + product); this.notify(); } public synchronized String consume() throws InterruptedException{ while(index == -1){ System.out.println("没有库存了"); this.wait(); } this.notify(); return products[index--]; } public static void main(String[] args) { final Storage s = new Storage(); new Thread(){ public void run() { while(true){ try { System.out.println("消费了" + s.consume()); } catch (InterruptedException e) { e.printStackTrace(); } try { TimeUnit.MILLISECONDS.sleep(new Random(1000).nextLong()); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); new Thread(){ public void run() { while(true){ try { s.produce("product" + new Random().nextInt(100)); } catch (InterruptedException e) { e.printStackTrace(); } try { TimeUnit.MILLISECONDS.sleep(new Random(1000).nextLong()); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); while(true); } } 一个线程生产,一个线程消费。 生产超出上限则wait消费,没超出则进行生产,开始生产了就应该通知消费者可以消费了。 消费线程没有商品则wait生产,有商品就消费,同时通知生产者可以继续生产了。 [Center]: /images/20220806/67daf16209b34159a81ce170650ca0b6.png
相关 Java并发编程:线程池与任务调度实例 在Java并发编程中,线程池和任务调度是两种常用的资源管理和执行策略。 1. 线程池: 线程池是一种预先创建一定数量的线程,并通过线程池来管理这些线程。使用线程池的优点包括: 小咪咪/ 2024年09月12日 08:36/ 0 赞/ 23 阅读
相关 Java并发编程:线程池与任务调度实战示例 Java并发编程中的线程池和任务调度是两种常用的多线程管理方式。下面将通过实例详细解释这两种概念。 1. **线程池(ThreadPool)**: 线程池是一种预先创建固定 快来打我*/ 2024年09月11日 01:48/ 0 赞/ 22 阅读
相关 JUC并发编程(3.Java线程) > [继上篇文章未完全介绍完join方法 > ][join_] 1.Join方法 1.1 有时效的join > 等够时间 public class 柔情只为你懂/ 2023年09月23日 22:51/ 0 赞/ 27 阅读
相关 【Java并发编程】操作系统基础(五):Java 线程模型、线程调度算法 1 Java 线程模型 Java 语言的线程,从规范的角度来说是不强制要求任何具体的实现方式的。采用1:1、N:1、M:N模型都可以。先放个传送门:[RednaxelaF 刺骨的言语ヽ痛彻心扉/ 2022年12月06日 15:53/ 0 赞/ 162 阅读
相关 【并发编程】Daemon 线程 前言 Github:[https://github.com/yihonglei/jdk-source-code-reading][https_github.com_yih 向右看齐/ 2022年10月27日 02:24/ 0 赞/ 145 阅读
相关 并发编程——线程同步 1、什么是线程同步 线程同步不是指平常所说的两件事情同时进行。它的目的是使多个线程之间协调工作,而且常常是避免两个线程同时进行某些操作,比如同时访问同一个共享资源。一般来说, 心已赠人/ 2022年10月01日 00:39/ 0 赞/ 179 阅读
相关 并发编程3-线程调度 状态图: ![Center][] 方法说明: run 线程运行的主体 yield() 放弃当前的时间片进入可运行状态,可以被再次选中 start() 线程进 短命女/ 2022年08月06日 12:04/ 0 赞/ 114 阅读
相关 并发编程-线程安全 1. 什么是线程安全 在多线程访问下, 不管哪个线程调用这个类,这个类总能表现出正确的行为 JMM 引发的问题 ![在这里插入图片描述][watermark_ty ゝ一纸荒年。/ 2022年04月24日 05:28/ 0 赞/ 271 阅读
相关 并发编程-线程池 newfixedthreadpool(固定线程数量的线程池) 可控制线程最大并发数,超出的线程会在队列中等待 ExecutorService newFixedT 小咪咪/ 2022年02月22日 13:14/ 0 赞/ 320 阅读
还没有评论,来说两句吧...