多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。即在一个程序中可以同时运行多个不同的线程来执行不同的任务, 也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
创建线程的三种方式:
- 继承 Thread()
- 实现 Runnable接口
- 实现Callable接口
新建线程
新建线程很简单。只要使用 new 关键字创建一个线程对象,并且将它 start() 起来即可。
Thread t1 = new Thread();
t1.start()
线程 Thread 有一个 run() 方法,start() 方法就会新建一个线程并让这个线程执行 run() 方法。
注意:不要用 run() 方法开启新线程。它只会在当前线程中串行执行 run() 方法中的代码。
如果你想让线程做点什么,就必须重写 run() 方法
Thread t1 = new Thread() {
@Override
public void run() {
System.out.println("Hello, I am t1");
}
}
t1.start();
上述代码使用匿名内部类,重写了 run() 方法。也可以通过继承线程 Thread,重写 run() 方法来自定义线程。
Runnable
考虑道 Java 是单继承的,也就是说继承本身也是一种很宝贵的资源,因此,我们也可以使用 Runnable 接口来实现同样的操作。
public interface Runnable {
public abstract void run();
}
默认的 Thread.run() 方法就是直接调用内部的 Runnable 接口。因此,使用 Runnable 接口实现多线程更为合理。
public class Thread2 implements Runnable {
public static void main(String[] args) {
Thread t1 = new Thread(new Thread2);
t1.start();
}
@Override
public void run() {
System.out.println("I am Runnable");
}
Callable
Callable 接口用来创建一个被线程执行的类,和 Runnable 类似,但又有区别。
public class TestCallable1 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableDemo callableDemo = new CallableDemo();
FutureTask futureTask = new FutureTask<>(callableDemo);
new Thread(futureTask).start();
String res = (String)futureTask.get();
System.out.println(res);
}
}
class CallableDemo implements Callable<String>{
@Override
public String call() {
return "I am Callable";
}
}
Callable 和 Runnable 区别:
-
Callable 规定的方法是 call(),而 Runnable 规定的方法是 run()。
-
Callable 的任务执行后可返回值,而 Runnable 的任务是不能返回值的。
-
call() 方法可抛出异常,而 run() 方法是不能抛出异常的。