JAVA概念中的多线程

时间:2016-06-26 11:43:36

标签: java multithreading

 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语句。

这背后的概念和工作程序是什么。因为它总是首先执行主要的结束。

4 个答案:

答案 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。