黑马程序员技术交流社区
标题:
线程实现问题
[打印本页]
作者:
sun~~
时间:
2013-1-7 23:50
标题:
线程实现问题
本帖最后由 张向辉 于 2013-1-16 11:54 编辑
1、如何实现线程间的通讯。
最好给代码!!
作者:
夏振博
时间:
2013-1-8 00:59
自己理解~根据注释的思路走!
/*
* 绑票
* 垃圾筒
* 好人
* 坏人
*/
public class ThreadDemo1 {
public static void main(String[] args) {
LaJiTong ljt = new LaJiTong();
HaoRen haoRen = new HaoRen(ljt);
HuaiRen huaiRen = new HuaiRen(ljt);
huaiRen.start();
haoRen.start();
}
}
/*
* 本类是好人类,它是一个线程!
* run():向共享数据(垃圾筒)中存钱!
*
* 因为可能好人取钱的速度没有坏人快,坏人发现没有钱就撕票了!
* 如果坏人发现没钱,开始等待好人存钱,那么在好人存钱之后应该去唤醒坏人。
*/
class HaoRen extends Thread {
private LaJiTong ljt;
public HaoRen(LaJiTong ljt) {
this.ljt = ljt;
}
public void run() {
synchronized (ljt) {
//存钱
System.out.println("好人:开始存钱!");
ljt.cun(500);
System.out.println("好人:存钱完毕!唤醒坏人!");
ljt.notify();
System.out.println("等待放人!");
try {
Thread.sleep(5000);//sleep()是不会释放监视器对象的!
} catch (InterruptedException e) {
}
}
}
}
/*
* 因为坏人有可能先去取钱,这时好人还没有存钱。
* 我们希望在坏人先取钱时,发现没有钱,应该等待好人存钱!
*
* 当好人存钱之后会唤醒坏人,然后坏人开始取钱!
*/
class HuaiRen extends Thread {
private LaJiTong ljt;
public HuaiRen(LaJiTong ljt) {
this.ljt = ljt;
}
public void run() {
synchronized (ljt) {
//查看钱
// 如果没有钱:撕票!
// 如果有钱:取钱,放人!
int balance = ljt.cha();
System.out.println("坏人:查看余额!");
if(balance <= 0) {
System.out.println("坏人:发现没钱,开始等待好人存钱!");
try {
ljt.wait();
} catch (InterruptedException e) {
}
System.out.println("坏人:我被唤醒了,重新查看垃圾筒!");
}
if(ljt.cha() <= 0) {
System.out.println("坏人:居然没有钱,撕票!");
} else {
System.out.println("坏人:哇,好多钱啊,开始取钱!");
ljt.qu();
System.out.println("坏人:钱已取到,放人!");
}
}
}
}
/*
* 垃圾筒类
* 它有一个属性是余额
* 有存、取、查三个方法
*/
class LaJiTong {
private int balance;
public void cun(int balance) {
this.balance = balance;
}
public void qu() {
this.balance = 0;
}
public int cha() {
return this.balance;
}
}
复制代码
作者:
黑马王振宇
时间:
2013-1-8 09:34
线程之间通讯有几个关键字,举例子:join() yield() wait() notify()等
另外还有判断线程是否活着啊,设置优先级等等。
他们之间通讯使用调用相应方法判断怎么执行和通讯的,具体请参照相应方法,
我这里给你举个简单例子,你可以看看,他说的是两个线程同时打印1-500,
这里加的yield()的意思是每当一个线程整除10的时候让另外的线程有机会执行。
public class TestThread extends Thread{
public static void main(String[] args){
Runner r = new Runner();
r.start();
for(int i=0; i<=500; i++){
System.out.println("main:" + i);
if(i%10==0){yield();}
}
}
}
class Runner extends Thread{
public void run(){
for(int i=0; i<=500; i++){
System.out.println("Runner:" + i);
if(i%10==0){yield();}
}
}
}
复制代码
希望能帮到你。。
作者:
丁强强
时间:
2013-1-16 12:05
拿走研究研究
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2