`

线程联合join

阅读更多
/**
 * ThreadJoin.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-16    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
*/

package cn.com.songjy.test.socket.thread;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:ThreadJoin 
 * 
 * 线程联合
 * 
 * 一个线程A在占有CPU资源期间,可以让其他线程调用join()和本线程联合,如
 * B.join();
 * 称线程A在运行期间联合了线程B。如果线程A在占有CPU资源期间一旦联合线程B,
 * 那么线程A将立刻中断执行,一直等到它联合的线程B执行完毕,线程A再重新排队等待CPU资源,
 * 以便恢复执行。如果线程A准备联合的线程B已经结束,那么B.join()不会产生任何效果。
 * 
 * 顾客只有等待电脑制造厂生产出电脑才能购买
 * @author   songjy
 * @version  1.0
 * @since    v1.0
 * @Date	 2013-8-16	下午3:18:17
 */

public class ThreadJoin implements Runnable {
	
	public static void main(String[] args) {
		ThreadJoin j = new ThreadJoin();
		j.customer.start();
		j.maker.start();
	}
	
	private static Log log = LogFactory.getLog(ThreadJoin.class);

	Computer c;
	
	Thread maker;
	Thread customer;
	
	ThreadJoin(){
		maker = new Thread(this);
		customer = new Thread(this);
		
		maker.setName("电脑制造厂");
		customer.setName("顾客");
		
		
	}
	
	@Override
	public void run() {
		if(Thread.currentThread() == customer) {
			log.info(customer.getName() + "等" + maker.getName() + "生产电脑");
			try {
				maker.join();//线程customer开始等待maker结束
				log.info(customer.getName() + "买了一台电脑:"+ c.name +",价格:" +c.price);
			} catch (InterruptedException e) {
				log.error(e.getMessage(), e);
			}
		} else if (Thread.currentThread() == maker) {
			log.info(maker.getName() + "开始生产电脑,请等待。。。。。。");
			try {
				Thread.sleep(2 * 1000l);
				//maker.sleep(2 * 1000l);//也可,简单明了
			} catch (InterruptedException e) {
				log.error(e.getMessage(), e);
			}
			
			c = new Computer("联想一体机", 4500.0f);
			
			log.info(maker.getName() + "生产完毕!");
		}
	}

	class Computer {
		String name;
		float price;
		Computer(String name, float price){
			this.name = name;
			this.price = price;
		}
	}
}

分享到:
评论

相关推荐

    Java多线程机制(讲述java里面与多线程有关的函数)

    线程联合(Join)是让一个线程等待另一个线程完成后再继续执行,通过调用`join()`方法实现。 9.11 守护线程: 守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,...

    java 多线程小例子 很方便 很实用 适合初学者

    - **联合特定时间**:未完整展示的部分可能涉及了如何设置线程联合的最长时间。例如,`t.join(10000)`将使`main`线程最多等待10秒,无论`TestThread`是否已经完成。这提供了一种避免无限等待的方法,增加了程序的...

    多线程同步,互斥,联合,守护,计时器线程Timer

    除了上述方法,Java还提供了`Thread.join()`让一个线程等待另一个线程完成,`Thread.sleep()`让线程暂停一段时间,以及`Thread.yield()`让当前线程让出CPU时间片等方法。例如,Example9_12.java和Example9_10.java...

    Java线程的联合用法实例分析

    在Java中,`join()`方法是实现线程联合的关键。它允许一个线程等待另一个线程完成其执行后再继续执行,从而确保特定的执行顺序。在多线程环境下,这有助于避免数据竞争和不一致的状态,提高程序的可控性和正确性。 ...

    JavaPD-Ch08mao线程1

    线程联合是指线程间协同工作,例如通过wait()、notify()或notifyAll()来控制线程的执行顺序。 8.11 守护线程 守护线程(Daemon Thread)是一种特殊的线程,它不会阻止Java虚拟机的退出。当所有的非守护线程都结束时...

    关于Linux多线程编程.pdf

    2. pthread_join:此函数用于等待一个线程结束,其需要两个参数:目标线程的pthread_t型标识符和一个指向void型指针的指针,用于接收目标线程的返回值。 3. pthread_exit:此函数用于线程主动结束运行,并提供退出...

    C++面向对象多线程编程.pdf

    - **线程的创建与销毁**:在C++中,可以使用`std::thread`库创建线程,`join()`或`detach()`来结束线程生命周期。 - **线程同步**: - **互斥量(Mutex)**:保证同一时间只有一个线程访问共享资源。 - **条件...

    Java实用课件第8章.ppt

    `join()`方法用于实现这种等待,调用`join()`的线程会等待被调用`join()`的线程结束后再继续执行。 守护线程(Daemon Thread)是一种特殊的线程,它的特点是当所有非守护线程结束后,即使守护线程还在运行,JVM也会...

    Java程序设计电子教案纯净版,高清

    线程的联合(Joining)允许一个线程等待另一个线程完成其任务,通过调用join()方法,调用线程会等待目标线程结束后再继续执行。 综上所述,Java程序设计中的线程管理是实现并发和多任务处理的核心,掌握线程的创建...

    SSM进阶3(Spring+SpringMVC+Mybatis)

    Mybatis提供了多种联查方式,如使用JOIN,子查询等。你将学习如何在Mapper中编写多表查询的SQL语句,以及如何返回相应的Java对象。 **七、批量操作** 批量插入和更新可以显著提高数据处理效率。Mybatis支持批量操作...

    c语言ISO_2011标准

    C11标准首次引入了线程API,定义在`<threads.h>`头文件中,包括`pthread_t`类型的线程标识符,`pthread_create`、`pthread_join`等线程创建和同步函数,为多线程编程提供了基础框架。 五、错误处理 C11增加了`...

    软件开发人员面试问卷

    `ArrayList`和`Vector`都是Java集合框架的一部分,但`ArrayList`是非线程安全的,而`Vector`是线程安全的。`HashMap`和`Hashtable`都是散列表的实现,但`HashMap`允许键和值为`null`,且非线程安全;而`Hashtable`不...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.42.docx

    设计高效索引策略要考虑字段的选择性、联合索引、覆盖索引和避免索引失效等情况,以最大化查询性能。 问题 12:请解释 RESTful API 设计原则,以及它在互联网应用中的重要性。如何设计符合 RESTful 风格的 API? ...

    Mysql配置文件说明

    `sort_buffer_size = 6M`、`read_buffer_size = 4M`、`join_buffer_size = 8M`分别用于排序、读取和联合查询操作的缓冲区大小,每个连接独立分配。 `myisam_sort_buffer_size = 64M`是MyISAM表排序操作的缓冲区大小...

    JRTASKS

    10. **Fork/Join框架**: 用于并行执行任务的框架,适用于分治算法,如Java的Parallel Streams就是基于此框架实现的。 从"JRTASKS-main"这个文件名来看,这可能是指JRTASKS项目的主模块或入口点,包含了项目的核心...

    韩顺平循序渐进学java从入门到精通(全知识点笔记整理).docx

    多表查询涉及多个表或视图的联合,包括笛卡尔积、JOIN操作(如内连接、外连接,如LEFT JOIN、RIGHT JOIN)。子查询是嵌入在其他SQL语句中的查询,可以用于`WHERE`、`FROM`等子句中,实现复杂的条件过滤和数据提取。...

    MySQL优化.docx

    * 缓存可重用线程数(thread_cache_size),见笑创建新线程的开销 SQL语句优化 * 优化子查询(sub query) * 优化表连接(join) * 使用索引,提高查询速度 * 避免使用SELECT \*,只选择需要的列 应用程序优化 *...

    linuxC参考手册(html)

    C语言通过pthread库提供线程操作,如pthread_create、pthread_join等。同时,fork和exec函数用于创建和执行新进程。 十、信号处理 信号是Linux系统中进程间通信的一种方式。C语言提供了sigaction等函数来注册信号...

    精通LINQ数据访问技术第10章

    9. LINQ与多线程:理解在并发环境中如何安全地使用LINQ,包括线程同步和异步查询。 10. 实战示例:通过具体的代码示例和项目实践,展示如何在实际开发中应用LINQ技术,以解决各种数据访问问题。 总之,第10章...

    mysql实用调优

    - 为经常出现在WHERE子句中的列创建索引,尤其是联合索引,以加速查询。 - 避免在索引列上使用NOT、NULL或函数,这会导致索引失效。 - 定期分析与优化索引,使用`ANALYZE TABLE`命令更新统计信息。 2. **查询...

Global site tag (gtag.js) - Google Analytics