并发编程3-线程调度

简介: <h2>状态图:</h2> <p><img src="http://img.blog.csdn.net/20150121181026125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhyZWVfbWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Ce

状态图:


方法说明:

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生产,有商品就消费,同时通知生产者可以继续生产了。

相关文章
|
4月前
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
66 1
|
15天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
4月前
|
算法 Unix Linux
linux线程调度策略
linux线程调度策略
81 0
|
4月前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
90 0
|
2月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
31 3
|
2月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
3月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
60 3
|
3月前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
3月前
|
存储 Java 数据处理
进程中的线程调度
进程是应用程序运行的基本单位,包括主线程、用户线程和守护线程。计算机由存储器和处理器协同操作,操作系统设计为分时和分任务模式。在个人PC普及后,基于用户的时间片异步任务操作系统确保了更好的体验和性能。线程作为进程的调度单元,通过覆写`Thread`类的`run`方法来处理任务数据,并由系统调度框架统一管理。微服务架构进一步将应用分解为多个子服务,在不同节点上执行,提高数据处理效率与容错性,特别是在大规模数据存储和处理中表现显著。例如,利用微服务框架可以优化算法,加速业务逻辑处理,并在不同区块间分配海量数据存储任务。
|
3月前
|
并行计算 API 调度
探索Python中的并发编程:线程与进程的对比分析
【9月更文挑战第21天】本文深入探讨了Python中并发编程的核心概念,通过直观的代码示例和清晰的逻辑推理,引导读者理解线程与进程在解决并发问题时的不同应用场景。我们将从基础理论出发,逐步过渡到实际案例分析,旨在揭示Python并发模型的内在机制,并比较它们在执行效率、资源占用和适用场景方面的差异。文章不仅适合初学者构建并发编程的基础认识,同时也为有经验的开发者提供深度思考的视角。