[英]Run two thread concurrently
我正在同時嘗試兩個打印兩個線程的名稱。 任何人都可以暗示,我在做什么錯? 我收到“ IllegalMonitorStateException
// ODD THREAD RUNNABLE公共類OddThread實現Runnable {
MainClass obj;
public OddThread(MainClass obj) {
// TODO Auto-generated constructor stub
this.obj= obj;
}
public void run() {
int number=1;
while(number <10)
{
obj.PrintNumbers();
notifyAll();
try {
wait();
} catch (InterruptedException e) {System.out.println("Exception in wait of OddThread");
}
number = number+2;
}
}
}
//甚至線程可運行
public class EvenThread implements Runnable{
MainClass obj;
public EvenThread(MainClass obj)
{
this.obj=obj;
}
public void run() {
int number=0;
while(number<=10)
{
obj.PrintNumbers();
notifyAll();
try {
wait();
} catch (InterruptedException e) {
System.out.println("Exception in wait of EvenThread");
}
number = number+2;
}
}
}
//主類
public class MainClass {
public static void main(String[] args)
{
MainClass obj = new MainClass();
// Boolean flag= true;
EvenThread evenThread = new EvenThread(obj);
OddThread oddThread = new OddThread(obj);
Thread Even = new Thread(evenThread);
Thread Odd = new Thread(oddThread);
Even.setName("Even Thread");
Odd.setName("Odd Thread");
Even.start();
Odd.start();
}
public synchronized void PrintNumbers()
{
System.out.println(Thread.currentThread().getName());
}
}
我得到的輸出是線程“偶數線程”中的偶數線程奇數線程異常線程“奇數線程”中的偶數線程異常java.lang.IllegalMonitorStateException
您應該將notifyAll()
和wait()
notifyAll()
在synchronized (this) {}
例如:
synchronized (this) {
notifyAll();
}
和
synchronized (this) {
wait();
}
這些方法notify()
, notifyAll()
, wait()
只能由作為此對象的監視器的所有者的線程調用,因此您必須將它們包圍在一個同步塊中,如此處所說的Object Java doc
這是正確的代碼:
public class MainClass {
public static int number=0;
public static void main(String[] args)
{
MainClass obj = new MainClass();
// Boolean flag= true;
EvenThread evenThread = new EvenThread(obj);
OddThread oddThread = new OddThread(obj);
Thread Even = new Thread(evenThread);
Thread Odd = new Thread(oddThread);
Even.setName("Even Thread");
Odd.setName("Odd Thread");
Even.start();
Odd.start();
}
public synchronized void PrintNumbers()
{
while(number<20)
{
System.out.println(number+"---"+Thread.currentThread().getName());
number++;
notifyAll();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class OddThread implements Runnable {
MainClass obj;
public OddThread(MainClass obj) {
// TODO Auto-generated constructor stub
this.obj= obj;
}
public void run() {
obj.PrintNumbers();
}
}
public class EvenThread implements Runnable{
MainClass obj;
public EvenThread(MainClass obj)
{
this.obj=obj;
}
public void run() {
int number=0;
obj.PrintNumbers();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.