Java 如何使线程并发运行?
我希望有两个单独的线程运行不同类的两个不同实例,并希望它们同时执行run命令 我上了一堂实践课来演示我遇到的问题。 一名选手向前数,另一名选手向后数Java 如何使线程并发运行?,java,multithreading,concurrency,runnable,Java,Multithreading,Concurrency,Runnable,我希望有两个单独的线程运行不同类的两个不同实例,并希望它们同时执行run命令 我上了一堂实践课来演示我遇到的问题。 一名选手向前数,另一名选手向后数 public class testCount { public static void main(String args[]) { testCount countCompetition = new testCount(); countCompetition.run(); } public
public class testCount {
public static void main(String args[]) {
testCount countCompetition = new testCount();
countCompetition.run();
}
public void run() {
(new Thread(new racer1())).start();
(new Thread(new racer2())).start();
}
public class racer1 implements Runnable {
public void run() {
for(int x = 0; x < 100; x++) {
System.out.println(x);
}
}
}
public class racer2 implements Runnable {
public void run() {
for(int y = 100; y > 0; y--) {
System.out.println(y);
}
}
}
}
我想要什么
1
100
2
99
3
98
他们不需要像那样轮流工作,但他们确实需要同时工作,而不是一个接一个地工作。
任何提示、建议或代码片段都将不胜感激。只需添加
Thread.sleep(1)在System.out.println()
之后的每个racer
类中的code>
i、 e.它看起来是这样的:
public class racer1 implements Runnable {
public void run() {
for(int x = 0; x < 100; x++) {
System.out.println(x);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
公共类racer1实现可运行{
公开募捐{
对于(int x=0;x<100;x++){
系统输出println(x);
试一试{
睡眠(1);
}捕捉(中断异常e){
Thread.currentThread().interrupt();
}
}
}
}
您需要编写一个基本的等待和通知系统。一个任务需要通知另一个任务他已经完成了工作。基本思想可以从下面的代码中推导出来。创建两个任务,一个向前计数,一个向后计数
Runnable task = new Runnable() {
public void run() {
System.out.println("woohooTwo");
synchronized (t) {
while (true) {
System.out.println("---" + Thread.currentThread().getName() + "--" + t.i.getAndIncrement());
t.notifyAll();
try {
Thread.sleep(1000);
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
};
我认为到目前为止所有的答案都没有抓住要点
您现有的逻辑确实允许两个线程同时执行,但这并不明显,因为您的数字最多只能达到100,并且执行通常会在一个特定线程中同时执行多条指令,否则,始终在当前执行的线程之间切换将有大量开销。在您的情况下,JVM决定执行第一个线程足够长的时间,以便在“上下文切换”到第二个线程之前打印出100个数字。JVM可能会选择以不同的方式执行线程,因此您看到的结果并不保证每次都是相同的
如果你将数字增加到1000,你会(可能)看到两个线程交错。您仍将有大量的运行,其中一个线程在一行中打印出大量的数字,因为JVM在切换之前执行一个线程一段时间比在每个指令之间切换上下文更有效
添加Thread.sleep(1)不是一个好的解决方案,因为您正在添加不必要的延迟。当然,对于100个数字,这可能不会被注意到,但是对于10000个数字,您将有10秒的延迟
是否有任何理由要求它们进行更高程度的交织?如果有,那么并发运行两个线程的简单模型是不够的。如果没有,那么就让JVM决定运行线程的最佳顺序(在您给出的简单示例中,这意味着它们可能不会在大部分时间交错)。@James没有让它们等待/睡眠的问题是,第一个线程将100%忙,因此,第二个线程不会被分配任何CPU时间。它也不能保证线程会一个接一个地运行。他们完成任务后,你需要等待并通知对方谢谢你的建议。幸运的是,线程交替对于我的项目的这一部分不是必需的。我以后会记住这一点。这不是关于交替线程,而是应该避免使用Thread.sleep()@AndremoniyThread.sleep
从来都不是避免争用条件的一种方法,最糟糕的是,如果它醒来,并且条件(其他线程作业)还没有形成,那么它会为任何事情消耗更多的CPU。在您的情况下,完全有可能产生意想不到的结果(导致无序)。管理您的案例的最佳方法之一:(比传统的basicwait
/notify
更好)我不知道您为什么在这项分析中被否决。通过向上投票纠正它。
Runnable task = new Runnable() {
public void run() {
System.out.println("woohooTwo");
synchronized (t) {
while (true) {
System.out.println("---" + Thread.currentThread().getName() + "--" + t.i.getAndIncrement());
t.notifyAll();
try {
Thread.sleep(1000);
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
};