方式一:
package day10; public class ThreadDemo1 { public static void main(String[] args) { Thread t = new MyThread(); t.start(); for (int i = 0; i < 4; i++){ System.out.println("主线程执行了"+ i); } } } class MyThread extends Thread{ public void run(){ for (int i = 0; i < 4; i++){ System.out.println("子线程执行了"+ i); } } }
方式二:
package day10; public class ThreadDemo2_1 { public static void main(String[] args) { MyRunnable mr = new MyRunnable(); Thread t = new Thread(mr); t.start(); for (int i = 0; i < 4; i++){ System.out.println("主线程执行了"+ i); } } } class MyRunnable implements Runnable{ public void run(){ for (int i = 0; i < 4; i++){ System.out.println("子线程执行了"+ i); } } }
方式三:
package day10; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class ThreadDemo3 { public static void main(String[] args) { // 目标:掌握多线程的创建方式三:实现Callable接口,方式三的优势:可以获取线程执行完毕后的结果的。 // 3、创建一个Callable接口的实现类对象。 Callable<String> c1 = new MyCallable(100); //4 把Callable对象封装成一个真正的线程任务对象FutureTask对象 /** * 未来任务对象的作用 * 本质上是一个Runnable线程任务对象,可以交给Thread线程对象处理 * 可以获取线程执行完毕后的结果 */ FutureTask<String> f1 = new FutureTask<>(c1); // 5 把FutureTask对象交给Thread线程对象处理 Thread t = new Thread(f1); //6 启动线程 t.start(); try { //7 获取线程执行完毕后的结果 String result = f1.get(); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } //定义一个实现类实现Callable接口 class MyCallable implements Callable<String>{ private int n ; public MyCallable(int n){ this.n = n; } //实现call方法,定义线程执行体 public String call() throws Exception { int sum = 0; for (int i = 1; i <= n; i++){ sum += i; } return "子线程计算1-" + n + "的和是:" + sum; } }
最后总结