先来个小总结:
yield()使当前线程暂停。但设置了setPriority(Thread.MAX_PRIORITY);时,yield()不咋管用了。
一般只需要重写run()方法的话,实现runnalbe接口比较方便。
如果在进程类里面需要访问同一个变量的话,就实现接口。如果用继承类的话,同一个变量就有几份的拷贝。但是内部类继承类的结和继承接口的效果一样。
启动一个线程
MyThread mt=new MyThread();
new Thread(mt).start();
好多东西都有时间片。时间片是个不确定的东西。
当调用wait(),notify()方法时,应该保证他们是同一个对象sy也要同一个对象。synchronized 中 才能有wait(),notify()方法。
synchronized(Object obj)与synchronized(this)的区别?!(谁能告诉我!!!!!)
下面是生产者与消费者的例子,为了方便,几个类直接写在一起了。
//new 生产者,消费者,队列。并起用生产者,消费者的线程
public class Test {
public static void main(String[] args) {
Queue q = new Queue();
Producer p = new Producer(q);
Consumer c = new Consumer(q);
p.start();
c.start();
}
}
//生产者,每生产好一个东西后,就往队列中放一个
class Producer extends Thread {
Queue q;
Producer(Queue q) {
this.q = q;
}
public void run() {
for (int i = 0; i < 10; i++) {
q.setValue(i);
System.out.println("Producer put:" + i);
}
}
}
//消费者,每当队列中有东西通知时,就从队列去拿
class Consumer extends Thread {
Queue q;
Consumer(Queue q) {
this.q = q;
}
public void run() {
while (true) {
System.out.println("Consumer get:" + q.getValue());
}
}
}
//队列
class Queue {
int value;
boolean flag = false;
//生产者往这放它所生产的东西
public synchronized void setValue(int i) {
//当生产好一个往队列中放了后,放置一个标志。发个通知,告诉说生产好了,并等待消费者来拿
if (!flag) {
value = i;
flag = true;
notify();
}
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//消费者从这获取东西
public synchronized int getValue() {
//消费这先判断队列是否有东西了,有的话,就让其他线程等待,自己取拿,拿好后设置一个标志,发个通告告诉其他线程,我拿好了
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false;
notify();
return value;
}
}
posted on 2007-01-15 00:27
xrzp 阅读(840)
评论(0) 编辑 收藏 所属分类:
JAVA