创建线程的方法
1、继承 Thread 类重写run 方法
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread...run...");
}
public static void main(String[] args) {
// 创建MyThread对象
MyThread t1 = new MyThread() ;
MyThread t2 = new MyThread() ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}
2、实现 Runnable 接口重写 run 方法
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable...run...");
}
public static void main(String[] args) {
// 创建MyRunnable对象
MyRunnable mr = new MyRunnable() ;
// 创建Thread对象
Thread t1 = new Thread(mr) ;
Thread t2 = new Thread(mr) ;
// 调用start方法启动线程
t1.start();
t2.start();
}
}
3、实现 Callable 接口重写 call 方法
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("MyCallable...call...");
return "OK";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建MyCallable对象
MyCallable mc = new MyCallable() ;
// 创建F
FutureTask<String> ft = new FutureTask<String>(mc) ;
// 创建Thread对象
Thread t1 = new Thread(ft) ;
Thread t2 = new Thread(ft) ;
// 调用start方法启动线程
t1.start();
// 调用ft的get方法获取执行结果
String result = ft.get();
// 输出
System.out.println(result);
}
}
注意: 我们在使用 Callable 创建现成的时候需要指定泛型的类型,泛型的类型与 call 方法返回的值一致。
Callable 创建线程适合于需要返回值的时候,我们只要使用 ft. get ()方法即可取出返回值。
4、线程池创建线程
public class MyExecutors implements Runnable{
@Override
public void run() {
System.out.println("MyRunnable...run...");
}
public static void main(String[] args) {
// 创建线程池对象
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.submit(new MyExecutors()) ;
// 关闭线程池
threadPool.shutdown();
}
}
5、runnable 和 callable 有什么区别
参考回答:
- 返回值: Runnable 接口 run 方法没有返回值;Callable 接口 call 方法有返回值,是个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果
- 异常处理: Callable 接口的 call ()方法允许抛出异常;而 Runnable 接口的 run ()方法的异常只能在内部消化,不能继续上抛
6、线程的 run()和 start()有什么区别?
- start(): 用来启动线程,通过该线程调用 run 方法执行 run 方法中所定义的逻辑代码。start 方法只能被调用一次。
- run (): 封装了要被线程执行的代码,可以被调用多次。
[!info]
也就是调用 run()方法就是相当于在主进程中执行一次,调用 start() 方法就是开启一个新的线程去执行 run()方法中的内容。