class MyThread extends Thread
{
public void run()
{
try
{
for(int i=0 ; i<10 ; i++)
{
System.out.println("I am Lazy Thread.");
Thread.sleep(2000);
}
}
catch (InterruptedException e)
{
System.out.println("I got interrrupted.");
}
}
}
class Test
{
public static void main(String[] args)
{
MyThread t = new MyThread();
t.start(); //after this line
t.interrupt();
System.out.println("end of main.");
}
}
在t.start();
和t.interrupt();
之后,为什么它首先打印结束,然后是子线程声明。
根据多线程概念,它也可能是子类的线程语句,但它总是首先执行主Thread语句。
这背后的概念和工作程序是什么。因为它总是首先执行主要的结束。
答案 0 :(得分:4)
为什么它首先打印主要结束然后是子线程声明。
这是因为每个线程都是独立运行的,这就是重点。
这背后的概念和工作程序是什么。因为它总是首先执行主要的结束而不是其他。
特别是,线程需要一段时间才能启动,远远超过完成main()
方法运行所需的时间。
你可以放慢主线程的速度,所以看到这种情况会更像你期望的那样。
public static void main(String[] args) throws InterruptedException {
MyThread t = new MyThread();
t.start(); //after this line
Thread.sleep(1); // thread might not start in this time or might complete.
t.interrupt();
Thread.sleep(1);
System.out.println("end of main.");
}
实际上,1毫秒可能太长,因为CPU可以在一毫秒内执行3,000,000条指令。
答案 1 :(得分:1)
正如文档所说
public void interrupt()
中断此主题。
除非当前线程正在中断(总是允许),否则将调用此线程的checkAccess方法,这可能导致抛出SecurityException。
如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long)时阻塞了这个线程,int),sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException。
如果在可中断通道上的I / O操作中该线程被阻塞,则通道将被关闭,线程的中断状态将被设置,线程将收到ClosedByInterruptException。
如果此线程在选择器中被阻塞,则线程的中断状态将被设置,它将立即从选择操作返回,可能具有非零值,就像选择器一样唤醒唤醒方法。
如果以前的条件都不成立,那么将设置该线程的中断状态。
中断非活动的线程无需任何效果。
抛出: SecurityException - 如果当前线程无法修改此线程
注意:对于线程,除非您明确同步,否则您不会按照执行方式的顺序得到任何保证
答案 2 :(得分:1)
用简单的语言编写新线程需要大量的初始化工作。即使主线程也需要自己的时间来启动,但由于主线程已经初始化并且正在运行,即使从它产生的线程处于初始化和执行阶段,它也会完成执行。
答案 3 :(得分:1)
在whos
之后有两个主题1是主,另一个是子主题。
两个线程彼此独立...:主线程初始化已经在子线程创建之前完成,而对于CPU(线程调度器:TS),它很容易处理并且首先执行t.start();
{ {1}}。如果T.S.用于子线程执行比绝对需要更多时间来完成。有一些算法可以在T.S.中工作。它首先想要选择哪些线程,它总是从T.S.中变化。到T.S。