Java 分别使用线程T1和T2打印奇数和偶数,如果出现素数,则按相反顺序打印
我最近接受了摩根士丹利(Morgan Stanley)的采访,有人问我这个问题。我必须在线程T1运行时打印所有奇数,在线程T2运行时打印偶数,但是嘿!还有更多,如果出现任何素数,那么我必须颠倒顺序,即现在用T2表示奇数,用T1表示偶数 下面是我试过的,但那个家伙看着我,好像他想因为这个解决方案把我关进监狱。我是多线程新手。可能有一种方法可以使用Java 分别使用线程T1和T2打印奇数和偶数,如果出现素数,则按相反顺序打印,java,multithreading,Java,Multithreading,我最近接受了摩根士丹利(Morgan Stanley)的采访,有人问我这个问题。我必须在线程T1运行时打印所有奇数,在线程T2运行时打印偶数,但是嘿!还有更多,如果出现任何素数,那么我必须颠倒顺序,即现在用T2表示奇数,用T1表示偶数 下面是我试过的,但那个家伙看着我,好像他想因为这个解决方案把我关进监狱。我是多线程新手。可能有一种方法可以使用notify()和wait()方法在多个线程之间建立通信来实现这一点。有人能把我带出监狱吗 public class MainClass extends
notify()
和wait()
方法在多个线程之间建立通信来实现这一点。有人能把我带出监狱吗
public class MainClass extends Thread {
@Override
public void run() {
for(int i=0;i<20;i++) {
String tname = Thread.currentThread().getName();
if(isPrime(i)) {
switch(tname) {
case "T2":
if(i%2 != 0)
System.out.println(tname + " - "+i);
break;
case "T1":
if(i%2 == 0)
System.out.println(tname + " - "+i);
break;
default:break;
}
}else {
switch(tname) {
case "T1":
if(i%2 != 0)
System.out.println(tname + " - "+i);
break;
case "T2":
if(i%2 == 0)
System.out.println(tname + " - "+i);
break;
default:break;
}
}
}
}
public boolean isPrime(int num) {
if(num <= 1) return false;
if(num == 2) return true;
for(int i=2;i<=num/2;i++) {
if(num%i == 0)
return false;
}
return true;
}
public MainClass(String name) {
super(name);
}
public static void main(String[] args) {
MainClass t1 = new MainClass("T1");
MainClass t2 = new MainClass("T2");
t1.start();
try {
t1.join();//always keep it inside the try otherwise compile time error
}catch(InterruptedException ie) {
ie.printStackTrace();
}
t2.start();
}
}
我会问面试官为什么要求你用两个线程来处理这几件事。为什么要一个接一个地运行这两个线程呢?可以缓存已经计算出的最大素数。然后在isPrime方法中,不启动i=2,而是启动i=biggestPrime。我认为还可以使用额外的线程引用变量evenThread和oddThread。您可以使用oddThread=T1和evenThread=T2来启动它们。当它是一个素数时,你只需要反转引用。然后你可以将开关块拉到if(isPrime())之外。@Andreas你能用我的代码的更好版本提供一个答案吗?
T1 - 1
T1 - 2
T1 - 9
T1 - 15
T2 - 0
T2 - 3
T2 - 4
T2 - 5
T2 - 6
T2 - 7
T2 - 8
T2 - 10
T2 - 11
T2 - 12
T2 - 13
T2 - 14
T2 - 16
T2 - 17
T2 - 18
T2 - 19