javaSE之线程联合

时间:2023-03-09 23:23:20
javaSE之线程联合

首先定义 : 一个线程A在占有CPU资源期间 ,可以让其他线程调用join()和本线程联合。

嗯哈,像书本这个列子:

如: B.join();

我们称A在运行期间联合了B, 如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻

中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行,

如果A准备联合的B线程已经结束,那么B.join(),不会产生任何效果。

 package dialog_color;

 public class Example12_8
{
public static void main(String args [])
{
ThreadJoin a = new ThreadJoin();
Thread customer = new Thread(a);
Thread cakeMaker = new Thread(a);
customer.setName("顾客");
cakeMaker.setName("蛋糕");
a.setJoinThread(cakeMaker);
customer.start();
}
}
class ThreadJoin implements Runnable
{
Cake cake;
Thread joinThread;
public void setJoinThread(Thread it)
{
this.joinThread=it;
}
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals("顾客"))
{
System.out.println(Thread.currentThread().getName()
+"等待"+joinThread.getName()+"制作生日蛋糕");
try {
joinThread.start();
joinThread.join(); } catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"买了"+cake.name+"价钱: "+cake.price);
}
else if(Thread.currentThread()==joinThread)
{
System.out.println(joinThread.getName()+"开始制作生日蛋糕,请等待......");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cake=new Cake("生日蛋糕",158);
System.out.println(joinThread.getName()+"制作完成!");
}
} class Cake //内部类 相当于一个结构体) (c/c++)
{
int price ;
String name;
Cake(String name ,int price)
{
this.name=name;
this.price=price;
}
}
}

效果图:

javaSE之线程联合

code:

 package tes;
/*
* 模拟这样一个过程
* 一个老头去买蛋糕,蛋糕需要先做,
* 老头等待做完,然后付款离开。
*
* */
public class Example12_9 { public static void main(String args [])
{
Thread aa,bb;
JoinThread hehe = new JoinThread();
aa = new Thread(hehe);
bb = new Thread(hehe);
aa.setName("老头");
bb.setName("蛋糕师傅");
hehe.setJoinThread(bb);
aa.start();
}
}
class JoinThread implements Runnable
{
Thread myThread;
cake mycake;
public void setJoinThread(Thread name) {
myThread=name;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread().getName().equals("老头"))
{
print(Thread.currentThread().getName()+"等待蛋糕师傅制作蛋糕"
+myThread.currentThread().getName()+"开始制作蛋糕.....");
//开始联合同步
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
print(myThread.currentThread().getName()+"蛋糕做完..."
+Thread.currentThread().getName()+"买了"+mycake.name
+" 价钱:"+mycake.price);
}
else if(Thread.currentThread()==myThread)
{
print(myThread.currentThread().getName()+
"开始制作蛋糕,wait for minutes !");
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
print("蛋糕做完了");
mycake = new cake("蛋糕",12.8);
}
}
private void print(String name){
System.out.println(name);
}
class cake
{
String name;
double price;
cake(String name,double price){
this.name=name;
this.price=price;
}
}
}

javaSE之线程联合