1、方式一:继承Thread类并重写run方法
*1、定义Thread类的子类,并重写run方法,该run方法体就代表线程需要完成的任务,称为线程执行体
*2、创建Thread子类的实例,即是创建了线程对象
*3、调用线程对象的start()方法来启动该线程public class MyThread extends Thread { private int i; // 线程执行体 public void run() { for (; i < 500; i++) { System.out.println(getName()+" "+i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { //获取当前线程名称 System.out.println(Thread.currentThread().getName()); if(i==40){ new MyThread().start();//创建并启动第一个线程 new MyThread().start();//创建并启动第二个线程 } } } }
注意:通过继承Thread类的方法创建线程类时,多个线程之间无法共享线程类的实例变量。
2、方式二:创建Runnable接口的实现类的实例,并将实例对象作为参数去创建Thread对象。
*1、定义Runnalbe接口的实现类,并重写run方法,该run方法体就代表线程需要完成的任务,称为线程执行体
*2、创建Runnalbe实现类的实例,并将此实例作为Thread的target方法参数来创建Thread对象,该Thread对象才是真正的线程对象
注意:通过创建Runnable接口的实现类创建线程类时,多个线程之间可以共享线程类的实例变量。public class MySecondThread implements Runnable { private int i; // 线程执行体 public void run() { for (; i < 100; i++) { System.out.println(Thread.currentThread().getName()+" "+i); } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { //获取当前线程名称 System.out.println(Thread.currentThread().getName()); if(i==40){ MySecondThread st = new MySecondThread(); //通过new Thread(target,name)方法创建新线程 new Thread(st,"新线程1").start();//创建并启动第一个线程 new Thread(st,"新线程2").start();//创建并启动第二个线程 } } } }
3、实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class MyTask implements Callable<Integer> { private int upperBounds; public MyTask(int upperBounds) { this.upperBounds = upperBounds; } @Override public Integer call() throws Exception { int sum = 0; for(int i = 1; i <= upperBounds; i++) { sum += i; } return sum; } } class Test { public static void main(String[] args) throws Exception { List<Future<Integer>> list = new ArrayList<>(); ExecutorService service = Executors.newFixedThreadPool(10); for(int i = 0; i < 10; i++) { list.add(service.submit(new MyTask((int) (Math.random() * 100)))); } int sum = 0; for(Future<Integer> future : list) { // while(!future.isDone()) ; sum += future.get(); } System.out.println(sum); } }