让我们考虑一下我们的思路:
public class HeavyWorkRunnable implements Runnable {
@Override
public void run() {
System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
try {
doDBProcessing();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
}
private void doDBProcessing() throws InterruptedException {
// TODO
}
}主要的方法是:
public class ThreadRunExample {
public static void main(String[] args){
Thread t1 = new Thread(new HeavyWorkRunnable(), "t1");
Thread t2 = new Thread(new HeavyWorkRunnable(), "t2");
System.out.println("Starting Runnable threads");
t1.start();
t2.start();
System.out.println("Doing main heavy processing - START "+Thread.currentThread().getName());
System.out.println("Runnable Threads has been started");
}
}现在,在不同的运行时,输出是不同的。例如:
Output1
启动可运行线程
做主要的重加工-启动主
做大量的处理-启动t1
做大量的处理-启动t2
重处理-端t2
已启动可运行线程
重处理-端t1
Output2
启动可运行线程
做主要的重加工-启动主
已启动可运行线程
做大量的处理-启动t1
重处理-端t1
做大量的处理-启动t2
重处理-端t2
根据我对线程的理解:
因此,系统应该完成“主”线程的任务,然后运行t1或t2。如果是这样的话,那么输出应该始终包含:
启动可运行线程
做主要重处理-启动主
可运行线程已启动
作为前三行。在我的理解中,我没有得到我错过的东西。
发布于 2016-05-31 12:15:30
问题是:操作系统和它们的处理队列是不同的。这是一个冗长的话题,但长话短说:当三个线程都在系统队列上时,操作系统只允许其中一个线程运行一小部分时间(称为量子),然后将其推入队列,让其他线程运行等等,从而幻想在单处理器--单核体系结构中进行多任务处理。因此,由于各种各样的原因,每次执行都将是不同的。
如果你真的想深入研究这个话题,就从这里开始吧,链接
发布于 2016-05-31 12:15:59
在单个处理器中,在给定时间只能运行一个线程,这是正确的。但是Java虚拟机包含一个称为线程调度器的组件。这个组件确实会选择哪个线程进入处理器,哪个线程退出。
启动线程时,它将进入runnable状态。当线程调度程序有一个用于处理时间的时隙时,它将从所有可运行的线程中挑选一个(如果它们都具有相同的优先级,则是随机的)。选中的线程进入running状态几毫秒后线程调度程序中断处理并将线程重新置于可运行状态。
因此,线程不能保证在离开处理器之前完成它的任务。
当您体验线程时,您应该考虑已经启动的所有线程都可以同时同时运行,因此没有保证的顺序。
您可能需要检查的是如何让线程等待其他线程(使用Object.wait()方法),但这远远超出了这个答案。
如果您需要深入研究Java中的线程处理,您应该考虑对在线资源进行特定的培训或google,因为这一点一点也不明显。
发布于 2016-05-31 12:38:25
首先,让我澄清一下您的理解:只有一个线程可以在给定的时间运行,这是正确的,但只适用于单核处理器,而不是多核处理器。
现在,主要的方法只是内部线程。现在,线程调度和时间切片取决于操作系统。因此,当您运行您的程序主方法时,它仍然在时间切片中,因此执行System.out.println("Doing main heavy processing - START "+Thread.currentThread().getName());语句,而不是执行进一步的语句。
如果您想要更改您的输出,那么您必须从OS的时间片中删除您的主线程。
因此,在t2.start();使用Thread.sleep(1000)之后,您可以检查您的t1或t2线程是否获得Scheduler并开始执行。
https://stackoverflow.com/questions/37545090
复制相似问题