多线程的实现方式
1.继承Thread类
- 继承Thread类,重写run()方法,创建子类对象,调用start()方法
public class ThreadDemo {
public static void main(String[] args) {
ThreadDemoTest threadDemoTest = new ThreadDemoTest();
threadDemoTest.start();
System.out.println("Thread main run...");
//jdk8 lambda简化写法
new Thread(() -> {
for (int i = 0; i < 9; i++) {
System.out.println(Thread.currentThread().getName() + " run ...");
}
}).start();
}
}
class ThreadDemoTest extends Thread{
@Override
public void run() {
for (int i = 0; i < 9; i++) {
System.out.println(Thread.currentThread().getName()+ " run ...");
}
}
}
2.实现Runnable接口,重写run()方法,创建Thread类对象,并将Runnable接口的实现对象作为参数传给Thread的构造方法中
public class RunnableDemo {
public static void main(String[] args) {
Thread thread = new Thread(new RunnableDemoTest());
thread.start();
System.out.println("Thread main run...");
}
}
class RunnableDemoTest implements Runnable {
@Override
public void run() {
for (int i = 0; i < 9; i++) {
System.out.println(Thread.currentThread().getName() + " run ...");
}
}
}
3.实现Runnable接口,重写run()方法,将Callable接口的实现对象作为FutureTask的元素,并将FutureTask对象作为参数传给Thread的构造方法中
public class CallableDemo {
public static void main(String[] args) {
CallableDemoTest callableDemoTest = new CallableDemoTest();
FutureTask<Object> futureTask = new FutureTask<>(callableDemoTest);//FutureTask接受线程返回的结果
Thread thread = new Thread(futureTask);
thread.start();
System.out.println("Thread main run...");
}
}
class CallableDemoTest implements Callable{
@Override
public Object call() throws Exception {
for (int i = 0; i < 9; i++) {
System.out.println(Thread.currentThread().getName()+ " run ...");
}
return null;
}
}
4.线程池实现
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);//2个线程池对象
RunnableThreadPoolTest runnableThreadPoolTest = new RunnableThreadPoolTest();
executorService.submit(runnableThreadPoolTest);
System.out.println("Thread main run...");
CallableThreadPoolTest callableThreadPoolTest = new CallableThreadPoolTest();
executorService.submit(callableThreadPoolTest);
System.out.println("Thread main run...");
executorService.shutdown();
}
}
class RunnableThreadPoolTest implements Runnable {
@Override
public void run() {
for (int i = 0; i < 9; i++) {
System.out.println(Thread.currentThread().getName() + " run ...");
}
}
}
class CallableThreadPoolTest implements Callable {
@Override
public Object call() throws Exception {
for (int i = 0; i < 9; i++) {
System.out.println(Thread.currentThread().getName() + " run ...");
}
return null;
}
}