public class Machine implements Runnable {
private int a = 1;
public void run(){
for(int i=0;i<10;i++) {
synchronized(this) {
a = a+i;
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
a = a-i;
System.out.println(Thread.currentThread().getName()+" : "+a);
}
}
}
public void go() {
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+" : "+i);
Thread.yield();
}
}
public static void main(String[] args){
Machine machine = new Machine();
Thread t1 = new Thread(machine);
Thread t2 = new Thread(machine);
t1.start();
t2.start();
machine.go();
}
}上例的输出结果是:
main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
main:8
main:9
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
为什么输出的结果是这个样子呢?为什么不是main主线程,t1,t2,轮流输出呢?在上例中红色标注的:Thread.yield()好像并没有起作用?请问这是为什么啊?为什么结果不会有这种可能呢?(多次执行,结果都一样,而且把go()方法中的i改成10000,还是这种结果)
main:0
Thread-0:1
Thread-0:1
Thread-1:1
Thread-1:1
Thread-1:1
Thread-1:1
Thread-0:1
main:1
Thread-0:1
Thread-0:1
main:2还有一个问题:
在生产者-消费者问题中,notify()方法是随机唤醒对象的等待池中的一个线程,但是等待池中既有生产者也有消费者线程,那它是有可能唤醒生产者线程,也有可能唤醒消费者线程吗?
谢谢各位了,在线等~!
private int a = 1;
public void run(){
for(int i=0;i<10;i++) {
synchronized(this) {
a = a+i;
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
a = a-i;
System.out.println(Thread.currentThread().getName()+" : "+a);
}
}
}
public void go() {
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+" : "+i);
Thread.yield();
}
}
public static void main(String[] args){
Machine machine = new Machine();
Thread t1 = new Thread(machine);
Thread t2 = new Thread(machine);
t1.start();
t2.start();
machine.go();
}
}上例的输出结果是:
main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
main:8
main:9
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
Thread-0:1
Thread-1:1
为什么输出的结果是这个样子呢?为什么不是main主线程,t1,t2,轮流输出呢?在上例中红色标注的:Thread.yield()好像并没有起作用?请问这是为什么啊?为什么结果不会有这种可能呢?(多次执行,结果都一样,而且把go()方法中的i改成10000,还是这种结果)
main:0
Thread-0:1
Thread-0:1
Thread-1:1
Thread-1:1
Thread-1:1
Thread-1:1
Thread-0:1
main:1
Thread-0:1
Thread-0:1
main:2还有一个问题:
在生产者-消费者问题中,notify()方法是随机唤醒对象的等待池中的一个线程,但是等待池中既有生产者也有消费者线程,那它是有可能唤醒生产者线程,也有可能唤醒消费者线程吗?
谢谢各位了,在线等~!
解决方案 »
- 一道面试题, 求更优答案!
- 菜鸟求指点
- Java Platform, Enterprise Edition 6 SDK Update 1配置的问题
- swt中如何让table中的item隐藏呢?
- jtable的问题
- java中如何计算一个类的大小??
- 关于传null
- 哪位有《Oracle 8i Java组件编程-EJB、CORBA和JSP》的光盘代码,万分感谢!
- 谁能将以下java代码帮我装换成c代码,要在linux下能运行,还要详细说明编译、运行步骤,不好意思,我对c不太熟悉
- 有什么问题呢?
- 一道关于string的题目,想不出来,大家有什么简便的方法
- 求一个排列的算法(从M的N次方),高手指点下
如果把Thread.yield();换成try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
,就会交替打印,但是也不是很有规律的交替
定一个游戏规则:生产者始终从一端开始放东西,消费者始终从另一端开始取东西。1.只要array中有空余位置,生产者就可以往array中放东西,否则只能等待array有空余位置。
2.只要array中有东西,消费者就可以取,否则只能等待array中有东西。
3.生产者和消费者不能同时操作array。