1.Thread
自定义线程类继承Thread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
写法:
public class ThreadDemo01 extends Thread {
@Override
public void run() {//run方法线程体
for (int i = 0; i <100; i++) {
System.out.println("多线程被执行了");
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
ThreadDemo01 td1 = new ThreadDemo01();
td1.start();//调用start方法开启线程
for (int i = 0; i <1000 ; i++) {
System.out.println("每天都在学习java");
}
}
}
2.Runnable接口
实现Runnable接口
推荐使用:避免单继承局限性,灵活方便,方便同一对象被多个线程使用
public class ThreadDemo03 implements Runnable{
@Override
public void run() {
for (int i = 0; i <200 ; i++) {
System.out.println("多线程被执行了");
}
}
public static void main(String[] args) {
new Thread(new ThreadDemo03()).start();
for (int i = 0; i <1000 ; i++) {
System.out.println("每天都在学习java");
}
}
}
lamd8表达式写法:
public class ThreadTest {
public static void main(String[] args) {
new Thread(() -> sleep()).start();
new Thread(() -> eat()).start();
}
public static void eat() {
System.out.println("我在吃饭");
}
public static void sleep() {
System.out.println("我在睡觉");
}
}
3.实现Callable接口
Callable<String> s1 =() -> "ss";
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future<String> submit = executorService.submit(s1);
System.out.println(submit.get());
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务:ExecutorService=Executor.newFixedThreadPool(1);
5.提交执行:Futureresult1=ser.submit(t1);
6.获取结果:boolean r1=result.get()
7.关闭服务:ser.shutdownNow();