一、创建线程的方式
1、继承Thread类
package 多线程与并发;
public class ThreadTest {
public static void main(String[] args) {
System.out.println("main...start...");
thread01 thread = new thread01();
//启动线程
thread.start();
System.out.println("main...end...");
}
public static class thread01 extends Thread{
@Override
public void run(){
System.out.println("当前线程"+Thread.currentThread().getId());
int i = 100/2;
System.out.println("运行结果"+i);
}
}
}
运行结果:
main...start...
main...end...
当前线程12
运行结果50
2、实现Runnable接口
package 多线程与并发;
public class ThreadTest {
public static void main(String[] args) {
System.out.println("main...start...");
Runnable01 runnable01 = new Runnable01();
//启动线程
new Thread(runnable01).start();
System.out.println("main...end...");
}
public static class Runnable01 implements Runnable {
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getId());
int i = 100/2;
System.out.println("运行结果"+i);
}
}
}
运行结果:
main...start...
main...end...
当前线程12
运行结果50
3、实现Callable接口+Future Task(可以拿到返回值,可以处理异常)
package 多线程与并发;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("main...start...");
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable01());
//启动线程
new Thread(futureTask).start();
//阻塞等待整个线程执行完成,获取返回值
Integer integer = futureTask.get();
System.out.println("main...end..."+integer);
}
public static class Callable01 implements Callable {
@Override
public Object call() throws Exception {
System.out.println("当前线程"+Thread.currentThread().getId());
int i = 100/2;
System.out.println("运行结果"+i);
return i;
}
}
}
运行结果:
main...start...
当前线程12
运行结果50
main...end...50
4、线程池
线程池的创建方式
①Executors
②new ThreadPoolExecutor
Future:可以获取到异步结果
corePoolSize:核心线程数,创建好就准备就绪的线程数量,就等待接受异步任务去执行,此核心线程一直存活,除非线程池消毁或指定allowCoreThreadTimeOut参数, maximumPoolSi