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()方法是随机唤醒对象的等待池中的一个线程,但是等待池中既有生产者也有消费者线程,那它是有可能唤醒生产者线程,也有可能唤醒消费者线程吗?
谢谢各位了,在线等~!
如果把Thread.yield();换成try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
,就会交替打印,但是也不是很有规律的交替
定一个游戏规则:生产者始终从一端开始放东西,消费者始终从另一端开始取东西。1.只要array中有空余位置,生产者就可以往array中放东西,否则只能等待array有空余位置。
2.只要array中有东西,消费者就可以取,否则只能等待array中有东西。
3.生产者和消费者不能同时操作array。