java+synchro_synchrozied,wait()与notify()的理解
public class TestWait{
private List list = new ArrayList();
public TestWait(){
}
public synchronized Object get(){
System.out.println(Thread.currentThread()+"進(jìn)入了...");
while(list.isEmpty()){
System.out.println(Thread.currentThread()+"在等待.....");
try{
//list為空,線(xiàn)程掛起,并釋放出對(duì)象鎖,從而讓下一個(gè)線(xiàn)程進(jìn)入該安全方法?wait();
}catch(Exception
e){
e.printStackTrace();
};
}
Object o = list.get(0);
list.remove(0);
return o;
}
public synchronized void put(){
System.out.println(Thread.currentThread()+"在加了一個(gè)值...");
list.add("nnn");
System.out.println("喚醒線(xiàn)程..");
//將wait的線(xiàn)程喚醒
notifyAll();?}
public static void
main(String[] args){
try{
TestWait tw =
new TestWait();
new
ThreadA(tw).start();
new
ThreadB(tw).start();
new
ThreadA(tw).start();
new
ThreadB(tw).start();
}catch(Exception?e){
e.printStackTrace();
};
}
}
class ThreadA extends Thread{
TestWait tw = null;
public ThreadA(TestWait tw){
this.tw = tw;
}
public void run(){
for(int i=0;i<10;i++){
try{
System.out.println(Thread.currentThread()+"取到了值:"+tw.get());
sleep(100);
tw.put();
}catch(Exception
e){
e.printStackTrace();
}
}
}
}
class ThreadB extends Thread{
TestWait tw = null;
public ThreadB(TestWait tw){
this.tw = tw;
}
public void run(){
for(int i=0;i<10;i++){
try{
sleep(100);
}catch(Exception
e){
e.printStackTrace();
}
tw.put();
}
}
}
####測(cè)試內(nèi)容如下
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]在等待.....
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]在等待.....
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-0,5,main]在等待.....
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-1,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-2,5,main]進(jìn)入了...
Thread[Thread-2,5,main]取到了值:nnn
Thread[Thread-3,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]進(jìn)入了...
Thread[Thread-0,5,main]取到了值:nnn
Thread[Thread-2,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
Thread[Thread-0,5,main]在加了一個(gè)值...
喚醒線(xiàn)程..
######jdk1.5以后的版本
ReentrantLock也能得到以上結(jié)果,如下
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.*;
public class TestWaitjdk15{
private List list = new ArrayList();
//鎖
private ReentrantLock lock = new
ReentrantLock();
//條件 相當(dāng)于之前的 wait 與 notify;
Condition con?=
lock.newCondition();
public TestWaitjdk15(){
}
public?Object get(){
lock.lock();
try{
System.out.println(Thread.currentThread()+"進(jìn)入了...");
while(list.isEmpty()){
System.out.println(Thread.currentThread()+"在等待.....");
try{
//list為空,線(xiàn)程掛起,并釋放出對(duì)象鎖,從而讓下一個(gè)線(xiàn)程進(jìn)入該安全方法?con.await();
}catch(Exception
e){
e.printStackTrace();
};
}
Object o = list.get(0);
list.remove(0);
return o;
}finally{
lock.unlock();
}
}
public?void put(){
lock.lock();
try{
System.out.println(Thread.currentThread()+"在加了一個(gè)值...");
list.add("nnn");
System.out.println("喚醒線(xiàn)程..");
//將wait的線(xiàn)程喚醒
con.signalAll();
}finally{
lock.unlock();
}
}
public static void main(String[] args){
try{
TestWaitjdk15
tw = new TestWaitjdk15();
new
ThreadC(tw).start();
new
ThreadD(tw).start();
new
ThreadC(tw).start();
new
ThreadD(tw).start();
}catch(Exception?e){
e.printStackTrace();
};
}
}
class ThreadC extends Thread{
TestWaitjdk15 tw = null;
public ThreadC(TestWaitjdk15 tw){
this.tw = tw;
}
public void run(){
for(int i=0;i<10;i++){
try{
System.out.println(Thread.currentThread()+"取到了值:"+tw.get());
sleep(100);
tw.put();
}catch(Exception
e){
e.printStackTrace();
}
}
}
}
class ThreadD extends Thread{
TestWaitjdk15 tw = null;
public ThreadD(TestWaitjdk15 tw){
this.tw = tw;
}
public void run(){
for(int i=0;i<10;i++){
try{
sleep(100);
}catch(Exception
e){
e.printStackTrace();
}
tw.put();
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java+synchro_synchrozied,wait()与notify()的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑重启快捷键怎么设置 电脑快速重启:设
- 下一篇: hadoop 写入mysql_使用Map