求告知Java线程的这个问题

头发白了一地 2019-03-23 10:17:43
为社么第二个输出线程名是在线程执行的后面,输出的时候却会跑到线程执行的前面
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class MyCalllable<V> implements Callable<V> {

public static void main(String[] args) {
// TODO Auto-generated method stub
Callable<Object> c1=new MyCalllable<Object>();
FutureTask<Object> t1=new FutureTask<Object>(c1);
Thread t=new Thread(t1);
t.setName("mycallable");
System.out.println(Thread.currentThread().getName());
t.start();
System.out.println(Thread.currentThread().getName());
}

@Override
public V call() throws Exception {
// TODO Auto-generated method stub
System.out.println("hello Callable");
return null;
}

}

输出如下:
main
main
hello Callable
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
流泪熊猫头 2019-03-23
  • 打赏
  • 举报
回复
线程之间的切换具有不确定性,是由操作系统来调度。你多跑几遍就会发现结果并不是每次都一样。
捡垃圾的小白 2019-03-23
  • 打赏
  • 举报
回复
我其实比较好奇你的futuretask方法。什么用。我等会去查查api。 而且你的main方法是程序的入口。本来运行就快。。然后你的线程跑起来估计就结束了。 估计会有只有两个main的情况
Defonds 2019-03-23
  • 打赏
  • 举报
回复
这就是异步执行和同步执行的区别
捡垃圾的小白 2019-03-23
  • 打赏
  • 举报
回复
如果你要多线程,按顺序执行,同步代码块。同步方法。还有锁方法。我刚刚视频看到这,而且很好理解。就算main方法和垃圾回收。jvm也是多线程,你在执行main方法的时候。有时候垃圾回收线程也会抢到cpu的执行权,也就是你经常在创建对象的时候也会回收垃圾。相当于你在左手右手同时打字,你左手先打完字。先出来。你右手打完你右手的字才出来。所以看人品?。设置线程优先级可以提高线程抢到执行权的几率,但是只是几率。如果你要先打后面也可以在main方法睡觉或者等待。然后执行后面了。在启动main方法
捡垃圾的小白 2019-03-23
  • 打赏
  • 举报
回复
多线程就是,,一起运行啊。你一个是获取主方法名字,一个1线程。然后1线程开启了。向下执行时候。主方法还在向下执行,所以先输出主方法名字。然后当1线程跑起来了。输出了一次。 当然我也是小白。可能是错的,
qq_39936465 2019-03-23
  • 打赏
  • 举报
回复
引用 楼主 头发白了一地 的回复:
为社么第二个输出线程名是在线程执行的后面,输出的时候却会跑到线程执行的前面
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class MyCalllable<V> implements Callable<V> {

public static void main(String[] args) {
// TODO Auto-generated method stub
Callable<Object> c1=new MyCalllable<Object>();
FutureTask<Object> t1=new FutureTask<Object>(c1);
Thread t=new Thread(t1);
t.setName("mycallable");
System.out.println(Thread.currentThread().getName());
t.start();
System.out.println(Thread.currentThread().getName());
}

@Override
public V call() throws Exception {
// TODO Auto-generated method stub
System.out.println("hello Callable");
return null;
}

}

输出如下:
main
main
hello Callable


因为你启动的是一个线程,后面的语句不需要等你的线程执行完毕,线程和你得main中后面的语句是同步执行的,由于执行速度上的快慢不同也会出现不同的结果,这里你main后面只有一句语句基本都是先于线程的输出。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧