Runnable实现多线程和Callable的区别
直接上代码
1.Runnable实现多线程
private class ShellRunnable implements Runnable {
private String ip;
private Integer port;
public ShellRunnable(String ip, Integer port) {
this.ip = ip;
this.port = port;
}
@Override
public void run() {
try {
// 休眠1秒,再 执行脚本
Thread.sleep(1 * 1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
可以看到run方法没有返回值,并不适用所有业务。
2.Callable实现多线程
private class ShellCallable implements Callable<String> {
private String ip;
private Integer port;
private String username;
private String password;
public ShellCallable(String ip, Integer port,String username,String password) {
this.ip = ip;
this.port = port;
this.username=username;
this.password=password;
}
@Override
public String call() throws Exception {
try {
// 休眠1秒,再 执行脚本
Thread.sleep(1 * 1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
return result;
}
}
可以看到Callable实现多线程走的是call()方法,是具有返回值的,定义的时候就在callable后面加上需要返回的数据类型泛型。我这边用的是String。
3.具体调用
一、Runnable
ShellRunnable shell=new ShellRunnable(ip,port);
new Thread(shell).start();
直接开启线程就行
二、Callable
ShellCallable shell = new ShellCallable(ip, port, username, password);
FutureTask futureTask = new FutureTask<>(shell);
new Thread(futureTask).start();
try {
String res = (String) futureTask.get();
System.out.println("res::" + res);
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这里用到了futureTask ,关于futureTask 和funture就不做解释了,懒。。
不过Callable这里有一个问题,我自己的坑。。
实现多线程的时候,开启一个线程,如果执行futureTask.get();方法,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
一开始不知道,测试的时候,完全没体现多线程的异步。。。