java Runnable和Thread以及Callable的区别
Thread
1、是一个类
2、只能被继承
实现方式
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){ ticket- }else{ break;
}}}
new ThreadTest().start();
Runnable
1、是一个接口
2、资源可以共享
thread实现了runnable接口
实现方式
class ThreadTest implements Runnable{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){ ticket- }else{ break;
}}}
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
Callable
1、是一个接口
2、Callable 使用 call() 方法, Runnable 使用 run() 方法
3、call() 可以返回值, 而 run()方法不能返回
4、call() 可以抛出受检查的异常,比如ClassNotFoundException, 而run()不能抛出受检查的异常
实现方式
//1、线程池实现
ThreadPoolExecutor aa = (ThreadPoolExecutor)Executors.newFixedThreadPool (100);
Future<Integer> task1 = aa.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 11;
}
});
//2、直接start
FutureTask<String> task = new FutureTask(new Callable(){
public String call(){
return "";
}
});
Thread thread = new Thread(task);
thread.start();
线程池实现
当调用submit的时候,会把Callable对象传递进去初始化一个FutureTask对象,然后调用execute方法。而FutureTask已有实现好的run方法。run方法中调用了call()方法
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
当submit传入的是Runnable对象时候,把Runnable经过转换变成FutureTask对象,然后调用execute方法。FutureTask已有实现好的run方法。run方法中调用了call()方法。call()方法在调用Runnable对象的run方法。代码如下
private static final class RunnableAdapter<T> implements Callable<T> {
private final Runnable task;
private final T result;
RunnableAdapter(Runnable task, T result) {
this.task = task;
this.result = result;
}
public T call() {
task.run();
//返回为空,也就是FutureTask.get()为空(RunnableFuture<Void> ftask = newTaskFor(task, null);)
return result;
}
}
直接start启动同上
1、是一个类
2、只能被继承
实现方式
class ThreadTest extends Thread{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){ ticket- }else{ break;
}}}
new ThreadTest().start();
Runnable
1、是一个接口
2、资源可以共享
thread实现了runnable接口
实现方式
class ThreadTest implements Runnable{
private int ticket = 100;
public void run(){
while(true){
if(ticket > 0){ ticket- }else{ break;
}}}
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
Callable
1、是一个接口
2、Callable 使用 call() 方法, Runnable 使用 run() 方法
3、call() 可以返回值, 而 run()方法不能返回
4、call() 可以抛出受检查的异常,比如ClassNotFoundException, 而run()不能抛出受检查的异常
实现方式
//1、线程池实现
ThreadPoolExecutor aa = (ThreadPoolExecutor)Executors.newFixedThreadPool (100);
Future<Integer> task1 = aa.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 11;
}
});
//2、直接start
FutureTask<String> task = new FutureTask(new Callable(){
public String call(){
return "";
}
});
Thread thread = new Thread(task);
thread.start();
线程池实现
当调用submit的时候,会把Callable对象传递进去初始化一个FutureTask对象,然后调用execute方法。而FutureTask已有实现好的run方法。run方法中调用了call()方法
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
当submit传入的是Runnable对象时候,把Runnable经过转换变成FutureTask对象,然后调用execute方法。FutureTask已有实现好的run方法。run方法中调用了call()方法。call()方法在调用Runnable对象的run方法。代码如下
private static final class RunnableAdapter<T> implements Callable<T> {
private final Runnable task;
private final T result;
RunnableAdapter(Runnable task, T result) {
this.task = task;
this.result = result;
}
public T call() {
task.run();
//返回为空,也就是FutureTask.get()为空(RunnableFuture<Void> ftask = newTaskFor(task, null);)
return result;
}
}
直接start启动同上