public abstract class Multithread implements Runnable{
static Thread t1 = new Thread(){
public synchronized void run(){
try {
for(;;){
System.out.println("java");
t1.sleep(300);
}
} catch (Exception e) {
System.out.println("Exception"+e);
}
}
};
static Thread t2 = new Thread(){
public synchronized void run(){
try{
for(;;){
System.out.println("world");
t2.sleep(300);
}
}catch(Exception e){
System.out.println("Exception"+e);
}
}
};
public static void main(String[] args) {
try{
t1.start();
t2.start();
}catch(Exception e){
System.out.println("Exception "+e);
}
}
@Override
public void run() {
System.out.println("running");
}
}
例外O / P:
java
world
java
world
java
world
.
.
.
.
观察 我尝试使用sleep()作为线程,它们会在某个时间点重叠 -
java
java
world
java
world
world
java
..
预期 我需要这两个线程并行运行,它不应该重叠,任何一个线程都可以启动。有什么想法吗?
答案 0 :(得分:1)
线程不准确。如果他们彼此依赖,则必须手动同步,例如:How to execute two threads Sequentially in a class
答案 1 :(得分:1)
你可以通过一个计数器实现这一点,如果计数器是0线程1执行,增加计数器并调用计数器上的notyfyAll(),如果计数器是1线程,则在计数器上调用wait()。反之亦然,线程2。
答案 2 :(得分:0)
当您并行执行两个线程时,每个线程都由底层操作系统独立执行。任务调度程序可以决定何时执行哪个线程。这可能会导致您遇到的时间分布不均匀。
对此的一个解决方案是使用共享Semaphore来锁定每个线程,直到另一个线程完成其任务。然后每个线程将获取两个信号量,一个用于自身,另一个用于另一个线程。两个信号量都以一个许可开始,因此第一个release()
调用不会阻止。然后线程会像那样工作(psudocode):
for (;;) {
otherThreadSemaphore.acquire(); // blocks until the other thread called release()
performWork();
ownThreadSemaphore.release(); // allows the other thread to perform another iteration
}
另一种方法是将无限循环移出线程。在循环的每次迭代中,您生成两个线程,然后使用thread.yield()等待两个线程完成,然后循环再次开始创建两个新线程。但请注意,创建线程可能是一项昂贵的操作,因此只有当线程在每次迭代中执行大量工作时才应执行此操作,这样做无关紧要。