/**
* 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;
}
}
}
分享到:
相关推荐
线程联合(Join)是让一个线程等待另一个线程完成后再继续执行,通过调用`join()`方法实现。 9.11 守护线程: 守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,...
- **联合特定时间**:未完整展示的部分可能涉及了如何设置线程联合的最长时间。例如,`t.join(10000)`将使`main`线程最多等待10秒,无论`TestThread`是否已经完成。这提供了一种避免无限等待的方法,增加了程序的...
除了上述方法,Java还提供了`Thread.join()`让一个线程等待另一个线程完成,`Thread.sleep()`让线程暂停一段时间,以及`Thread.yield()`让当前线程让出CPU时间片等方法。例如,Example9_12.java和Example9_10.java...
在Java中,`join()`方法是实现线程联合的关键。它允许一个线程等待另一个线程完成其执行后再继续执行,从而确保特定的执行顺序。在多线程环境下,这有助于避免数据竞争和不一致的状态,提高程序的可控性和正确性。 ...
线程联合是指线程间协同工作,例如通过wait()、notify()或notifyAll()来控制线程的执行顺序。 8.11 守护线程 守护线程(Daemon Thread)是一种特殊的线程,它不会阻止Java虚拟机的退出。当所有的非守护线程都结束时...
2. pthread_join:此函数用于等待一个线程结束,其需要两个参数:目标线程的pthread_t型标识符和一个指向void型指针的指针,用于接收目标线程的返回值。 3. pthread_exit:此函数用于线程主动结束运行,并提供退出...
- **线程的创建与销毁**:在C++中,可以使用`std::thread`库创建线程,`join()`或`detach()`来结束线程生命周期。 - **线程同步**: - **互斥量(Mutex)**:保证同一时间只有一个线程访问共享资源。 - **条件...
`join()`方法用于实现这种等待,调用`join()`的线程会等待被调用`join()`的线程结束后再继续执行。 守护线程(Daemon Thread)是一种特殊的线程,它的特点是当所有非守护线程结束后,即使守护线程还在运行,JVM也会...
线程的联合(Joining)允许一个线程等待另一个线程完成其任务,通过调用join()方法,调用线程会等待目标线程结束后再继续执行。 综上所述,Java程序设计中的线程管理是实现并发和多任务处理的核心,掌握线程的创建...
Mybatis提供了多种联查方式,如使用JOIN,子查询等。你将学习如何在Mapper中编写多表查询的SQL语句,以及如何返回相应的Java对象。 **七、批量操作** 批量插入和更新可以显著提高数据处理效率。Mybatis支持批量操作...
C11标准首次引入了线程API,定义在`<threads.h>`头文件中,包括`pthread_t`类型的线程标识符,`pthread_create`、`pthread_join`等线程创建和同步函数,为多线程编程提供了基础框架。 五、错误处理 C11增加了`...
`ArrayList`和`Vector`都是Java集合框架的一部分,但`ArrayList`是非线程安全的,而`Vector`是线程安全的。`HashMap`和`Hashtable`都是散列表的实现,但`HashMap`允许键和值为`null`,且非线程安全;而`Hashtable`不...
设计高效索引策略要考虑字段的选择性、联合索引、覆盖索引和避免索引失效等情况,以最大化查询性能。 问题 12:请解释 RESTful API 设计原则,以及它在互联网应用中的重要性。如何设计符合 RESTful 风格的 API? ...
`sort_buffer_size = 6M`、`read_buffer_size = 4M`、`join_buffer_size = 8M`分别用于排序、读取和联合查询操作的缓冲区大小,每个连接独立分配。 `myisam_sort_buffer_size = 64M`是MyISAM表排序操作的缓冲区大小...
10. **Fork/Join框架**: 用于并行执行任务的框架,适用于分治算法,如Java的Parallel Streams就是基于此框架实现的。 从"JRTASKS-main"这个文件名来看,这可能是指JRTASKS项目的主模块或入口点,包含了项目的核心...
多表查询涉及多个表或视图的联合,包括笛卡尔积、JOIN操作(如内连接、外连接,如LEFT JOIN、RIGHT JOIN)。子查询是嵌入在其他SQL语句中的查询,可以用于`WHERE`、`FROM`等子句中,实现复杂的条件过滤和数据提取。...
* 缓存可重用线程数(thread_cache_size),见笑创建新线程的开销 SQL语句优化 * 优化子查询(sub query) * 优化表连接(join) * 使用索引,提高查询速度 * 避免使用SELECT \*,只选择需要的列 应用程序优化 *...
C语言通过pthread库提供线程操作,如pthread_create、pthread_join等。同时,fork和exec函数用于创建和执行新进程。 十、信号处理 信号是Linux系统中进程间通信的一种方式。C语言提供了sigaction等函数来注册信号...
9. LINQ与多线程:理解在并发环境中如何安全地使用LINQ,包括线程同步和异步查询。 10. 实战示例:通过具体的代码示例和项目实践,展示如何在实际开发中应用LINQ技术,以解决各种数据访问问题。 总之,第10章...
- 为经常出现在WHERE子句中的列创建索引,尤其是联合索引,以加速查询。 - 避免在索引列上使用NOT、NULL或函数,这会导致索引失效。 - 定期分析与优化索引,使用`ANALYZE TABLE`命令更新统计信息。 2. **查询...