我是一名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");
}
}
答案 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赢了。
作为旁注,一般情况下,您可能希望尽可能使用ExecutorService和Callable,因为这些是更高级别的新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");
}
}