多线程中run()和start()方法的区别

J2EE 码拜 8年前 (2016-03-14) 1087次浏览
小白在看多线程的时候,发现有的通过a.start()启动线程,有点a.run() 来启动线程体,不清楚呀,晕呐,找找找,结论如下:
private FutureTask<V> refreshCache(final K key) {
final FutureTask<V> refreshTask = new FutureTask<V>(new Callable<V>() {
@Override
public V call() throws Exception {
V value = 1;
return value;
}
});
FutureTask f = this.cacheRefreshTask.putIfAbsent(key, refreshTask);
if (f == null) {
Thread refreshThread = new Thread(new Runnable() {
@Override
public void run() {
try {
refreshTask.run(); V value = refreshTask.get();
CacheObject<V> cacheObject = new CacheObject<V>(value, 60, “s”);
cache.put(key, cacheObject);
map.remove(key, refreshTask);
} catch (InterruptedException e) {
map.remove(key, refreshTask);
log.error(“更新缓存对象失败,key:” + key, e);
} catch (ExecutionException e) {
map.remove(key, refreshTask);
log.error(“更新缓存对象失败,key:” + key, e);
} catch (Exception e) {
map.remove(key, refreshTask);
log.error(“更新缓存对象失败,key:” + key, e);
} finally {
cacheRefreshTask.remove(key, refreshTask);
}
}
});
refreshThread.start();
return refreshTask;
}
return f;
}
区分:
1. start()方法来启动线程,真正实现了多线程运行:start方法启动后,此start()后续的代码立马执行,无论run()方法体有没有被cpu进行调度,这就是多线程
2. run()方法当作普通方法的方式调用。这是一种同步的调用,没有多线程的异步特征
参考:http://blog.csdn.net/xuxurui007/article/details/7685076
解决方案

5

线程的2种实现方式,Thread的start函数里会调用传入runnable接口实现类的run函数

5

你可以简单的理解为,runnable放在Thread里边跑,或本人跑

5

你可以写一个循环试试就知道了 start 瞬间后台并发处理 run是一个一个的

5

start是启动线程的,run是线程的一个静态方法

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明多线程中run()和start()方法的区别
喜欢 (0)
[1034331897@qq.com]
分享 (0)