Java Threads如何工作

时间:2015-06-14 13:03:47

标签: java multithreading

我是一名Java学习者,试图理解线程。

我期待下面的程序输出

  

线程已启动Run Method Bye

但我按顺序输出

  

再见线程启动了运行方法

这是我的代码:

public class RunnableThread
{
    public static void main(String[] args)
    {
        MyThread t1= new MyThread("Thread started");
        Thread firstThread= new Thread(t1);
        firstThread.start();
        System.out.println("Bye");
    }
}

class MyThread implements Runnable
{
    Thread t;
    String s= null;

    MyThread(String str)
    { 
      s=str;
    }

    public void run()
    {
      System.out.println(s);
      System.out.println("Run Method");
    }
}

6 个答案:

答案 0 :(得分:4)

在多线程代码中,无法保证哪个线程将以什么顺序运行。这是多线程的核心,不仅限于Java。你可以得到一次t1,t2,t3,t3,t1,t2等等。

在你的情况下,有2个线程。一个是主线程,另一个是firstThread。尚未确定哪个将首先执行。

答案 1 :(得分:3)

这是线程的全部内容 - 它们同时运行(如果你的处理器只有一个核心,它是伪同步的,但程序员没有区别)。

当你在Thread对象上调用 Thread.start()方法时,它是相似的(但不一样,因为它启动一个线程,而不是一个进程,而且前者更耗费资源)同时启动另一个java程序。所以firstThread.start()开始运行你的主线程的paralel(由你的main方法启动)。

此行启动主执行线程(如zeroThread)

public static void main(String[] args)

您可以通过调用Thread.sleep()来引用它。

这一行

firstThread.start();

启动另一个线程,但是为了引用它,你使用它的名字,但你从主线程引用它,它运行paralel到firstThread。 为了获得预期的输出,你可以加入这两个线程,就像链接它们一样: 这样:

public static void main(String[] args)
{
    MyThread t1= new MyThread("Thread started");
    Thread firstThread= new Thread(t1);
    firstThread.start();
    firstThread.join();
    System.out.println("Bye");
}

join(),调用firstThread( by main thread )强制主线程等到firstThread完成运行(它将暂停程序到下一个命令,即System.out.println ( “再见”);。)

答案 2 :(得分:2)

main()等待所有事情完成时,您似乎在寻找线程(可能不止一个)。 ExecutorService提供了一种很好的方法来管理它 - 包括在时间阈值之后纾困的能力。

import java.util.concurrent.*;                                                   

class MyThread implements Runnable { // ... }                                    

class MyProgram {                                                                
  public static void main(String[] args)                                         
  {                                                                              
    MyThread t1 = new MyThread();                                            
    MyThread t2 = new MyThread();                                            
    MyThread t3 = new MyThread();                                            

    // At this point, 3 threads teed up but not running yet                  

    ExecutorService es = Executors.newCachedThreadPool();                    

    es.execute(t1);                                                          
    es.execute(t2);                                                          
    es.execute(t3);                                                          

    // All three threads now running async                                   

    // Allow all threads to run to completion ("orderly shutdown")            
    es.shutdown();                                                           

    // Wait for them all to end, up to 60 minutes.  If they do not 
    // finish before then, the function will unblock and return false:          
    boolean finshed = es.awaitTermination(60, TimeUnit.MINUTES);             

    System.out.println("Bye");                                               
  }                                                                            
}                                                                               

答案 3 :(得分:0)

没有指定Java线程运行的指定顺序。这适用于所有线程,包括" main"线程。

如果你真的想看到它有效,请尝试:

mDemoSlider = (SliderLayout) findViewById(R.id.slider);
        HashMap<String, String> url_maps = new HashMap<>();
        url_maps.put("title1", "http://url/pic1.jpg");
        url_maps.put("title2", "http://url/pic3.jpg");
        url_maps.put("title3", "http://url/pic3.jpg");
        for (String name : url_maps.keySet()) {
            TextSliderView textSliderView = new TextSliderView(this);
            // initialize a SliderLayout
            textSliderView
                    .description(name)
                    .image(url_maps.get(name))
                    .setScaleType(BaseSliderView.ScaleType.Fit);
            //add your extra information
            textSliderView.bundle(new Bundle());
            textSliderView.getBundle()
                    .putString("extra", name);
            mDemoSlider.addSlider(textSliderView);
        }
        mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Accordion);
        mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Right_Bottom);
        mDemoSlider.setCustomAnimation(new DescriptionAnimation());
        mDemoSlider.setDuration(6000);

答案 4 :(得分:0)

这是线程启动顺序问题。由于您实际上只是启动单个帖子

这实际上更像是 API调用速度问题。

基本上,你有一个 println()打印&#34; bye&#34;,一旦Thread.start()返回就会被调用。 Thread.start()返回immediately after being called.不等待 run()调用完成。

所以你正在赛跑&#34; println&#34;和#34; thread.start()&#34;之后的线程初始化,并且println赢了。

作为旁注,一般情况下,您可能希望尽可能使用ExecutorServiceCallable,因为这些是更高级别的新API。

答案 5 :(得分:0)

启动线程时,它将与当前线程并行执行,因此 保证执行顺序。

尝试一下:

public class RunnableThread {
    static class MyThread implements Runnable {
        Thread t;
        String s= null;    
        MyThread(String str) { 
          s=str;
        }
        public void run() {
          System.out.println(s);
          System.out.println("Run Method");
        }
    }
    public static void main(String[] args) {
        MyThread t1= new MyThread("Thread started");
        Thread firstThread= new Thread(t1);
        firstThread.start();
        boolean joined = false;
        while (!joined)
            try {
                firstThread.join();
                joined = true;
            } catch (InterruptedException e) {}
        System.out.println("Bye");
    }
}