我应该在此代码中做哪些更改,以便两个线程一直到数组的末尾并打印其所有内容
What changes should I do in this code so that the two threads go till the end of the Array and print all of its content
我正在尝试打印数组中的所有数字,从索引 0 处的 1 开始,最后以 11 结束。
有两个线程正在执行此操作,一个仅打印偶数,第二个仅打印奇数。
这是代码。
class PrintEvenOdd {
static class SourceData {
int[] arr;
volatile int counter;
public SourceData(int[] commonArr, int counter){
this.arr = commonArr;
this.counter = counter;
}
public void getData(){
try{
synchronized(this){
while((counter%2==0 && Thread.currentThread().getName().equalsIgnoreCase("odd")) || (counter%2!=0 && Thread.currentThread().getName().equalsIgnoreCase("even"))){
wait();
}
System.out.println(counter+ " : " + Thread.currentThread().getName());
notify();
}
}catch(Exception ie){
ie.printStackTrace();
}
}
}
static class Even extends Thread{
SourceData sd;
public Even(SourceData sd){
this.sd = sd;
}
@Override
public void run(){
while(sd.counter < 12) {
sd.getData();
sd.counter++;
}
}
}
static class Odd extends Thread{
SourceData sd;
public Odd(SourceData sd){
this.sd = sd;
}
@Override
public void run(){
while(sd.counter < 12) {
sd.getData();
sd.counter++;
}
}
}
public static void main(String[] args){
int[] commonArr = new int[11];
for(int i = 0; i < commonArr.length; i++){
commonArr[i] = i;
}
int counter = 0;
SourceData sd = new SourceData(commonArr, counter);
Even even = new Even(sd);
even.setName("EVEN");
even.start();
Odd odd = new Odd(sd);
odd.setName("ODD");
odd.start();
}
}
这段代码的问题在于它只打印了两个值,如图所示,
0 : EVEN
1 : ODD
我应该做哪些更改才能使代码打印数组末尾的所有值?
这是正在发生的事情:EVEN 运行,将计数器递增到 1,然后在接下来的 getData
中它开始等待。然后 ODD 运行,将计数器递增到 2,然后它也开始等待 getData
。你有两个线程在等待,没有机会醒来。
要修复它,您必须在线程等待的条件发生变化时发出通知。即:在sd.counter++
之后通知,这样其他线程才能唤醒。由于另一个线程正在等待 sd
,您必须调用:
sd.counter++
sd.notify()
另请注意,ODD 和 EVEN 线程是相同的。您可以让一个 class 实现该线程,并创建它的两个实例。
我正在尝试打印数组中的所有数字,从索引 0 处的 1 开始,最后以 11 结束。 有两个线程正在执行此操作,一个仅打印偶数,第二个仅打印奇数。
这是代码。
class PrintEvenOdd {
static class SourceData {
int[] arr;
volatile int counter;
public SourceData(int[] commonArr, int counter){
this.arr = commonArr;
this.counter = counter;
}
public void getData(){
try{
synchronized(this){
while((counter%2==0 && Thread.currentThread().getName().equalsIgnoreCase("odd")) || (counter%2!=0 && Thread.currentThread().getName().equalsIgnoreCase("even"))){
wait();
}
System.out.println(counter+ " : " + Thread.currentThread().getName());
notify();
}
}catch(Exception ie){
ie.printStackTrace();
}
}
}
static class Even extends Thread{
SourceData sd;
public Even(SourceData sd){
this.sd = sd;
}
@Override
public void run(){
while(sd.counter < 12) {
sd.getData();
sd.counter++;
}
}
}
static class Odd extends Thread{
SourceData sd;
public Odd(SourceData sd){
this.sd = sd;
}
@Override
public void run(){
while(sd.counter < 12) {
sd.getData();
sd.counter++;
}
}
}
public static void main(String[] args){
int[] commonArr = new int[11];
for(int i = 0; i < commonArr.length; i++){
commonArr[i] = i;
}
int counter = 0;
SourceData sd = new SourceData(commonArr, counter);
Even even = new Even(sd);
even.setName("EVEN");
even.start();
Odd odd = new Odd(sd);
odd.setName("ODD");
odd.start();
}
}
这段代码的问题在于它只打印了两个值,如图所示,
0 : EVEN
1 : ODD
我应该做哪些更改才能使代码打印数组末尾的所有值?
这是正在发生的事情:EVEN 运行,将计数器递增到 1,然后在接下来的 getData
中它开始等待。然后 ODD 运行,将计数器递增到 2,然后它也开始等待 getData
。你有两个线程在等待,没有机会醒来。
要修复它,您必须在线程等待的条件发生变化时发出通知。即:在sd.counter++
之后通知,这样其他线程才能唤醒。由于另一个线程正在等待 sd
,您必须调用:
sd.counter++
sd.notify()
另请注意,ODD 和 EVEN 线程是相同的。您可以让一个 class 实现该线程,并创建它的两个实例。