多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。
优点:可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
缺点:
public class CreateThread extends Thread{
@Override
public void run() {
//获取线程名
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
CreateThread createThread = new CreateThread();
//线程启动
createThread.start();
}
}
public class RunnableCreateThread implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口创建线程");
}
public static void main(String[] args) {
new Thread(new RunnableCreateThread()).start();
}
}
匿名内部类:
new Thread(new Runnable() {
@Override
public void run() {
// 调用资源方法,完成业务逻辑
}
}, "your thread name").start();
lambda表达式:
new Thread(() -> {
}, "your thread name").start();
与 Runnable 接口不一样,Callable 接口提供了一个 call() 方法作为线程执行体,call() 方法比 run() 方法功能要强大,比如:call() 方法可以有返回值、call() 方法可以声明抛出异常。
public class CreateThread1 implements Callable {
@Override
public Object call() throws Exception {
System.out.println(Thread.currentThread().getName());
return "call() 方法可以有返回值、call() 方法可以声明抛出异常";
}
public static void main(String[] args) {
//创建 FutureTask 对象
FutureTask futureTask = new FutureTask<>(new CreateThread1());
//创建线程并启动
Thread thread = new Thread(futureTask);
thread.start();
try {
Thread.sleep(1000);
//获取返回值
System.out.println("返回的结果是:" + futureTask.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
(可去查看线程池的章节)
public class CreateThreadByExecutors implements Runnable {
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
CreateThreadByExecutors thread = new CreateThreadByExecutors();
for (int i = 0; i < 10; i++) {
service.execute(thread);
System.out.println("=======任务开始=========");
service.shutdown();
}
}
@Override
public void run() {
System.out.println("hello Thread");
}
}
相同点:
区别:
线程5个状态:创建、就绪、运行、阻塞和死亡。
调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。