- 继承Thread类或者创建Thread对象
我们可以创建子类继承Thread类并重写run()方法,或者直接创建Thread对象重写run()方法
①继承Thread类、
public class MyThread01 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
class MyThread extends Thread{
@Override
public void run() {
System.out.println("执行线程任务....");
}
}
②创建Thread对象
runnable接口实现了函数式注解,这意味着我们可以通过lambda表达式描述其任务
Thread t1 =new Thread(()->{
System.out.println("在执行任务.....");
});
t1.start();
- 实现runnable接口
我们通过创建类引用runnable接口或者创建runnable接口的匿名实现类创建线程
Runnable runnable=new Runnable() {
@Override
public void run() {
System.out.println("执行任务");
}
};
Thread thread=new Thread(runnable);
thread.start();
- 使用Callable和Future创建
- Callable callable= new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int a=10;
int b=20;
return a+b;
}
};
FutureTask<Integer> integerFutureTask = new FutureTask<Integer>(callable);
Thread t=new Thread(integerFutureTask);
t.start();
try {
Integer integer = integerFutureTask.get();
System.out.println("返回的结果为"+integer);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
runnable和callable的区别
①Callable要实现call(),并且有返回值,Runnable要实现run(),没有返回值
②Callable的call()可以抛出异常,Runnable的run()不能抛出异常
③Callable要搭配FutureTask一起使用,通过futureTask.get()来获取call()方法的返回值
④两者都是描线程任务的接口
利用线程池创建线程:在一般情况下我们使用自定义的线程池创建线程
public class MyExecutor {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(5),
new ThreadPoolExecutor.AbortPolicy());
//创建任务并提交至线程池,线程池就可执行任务
for (int i=0;i<10;++i){
int j=i;
threadPoolExecutor.submit(()->{
System.out.println(Thread.currentThread().getName()+"执行任务"+j);
});
}
}
}