1.继承Thread类,重写run()方法
创建一个类并继承Thread类,然后重写Thread类的run()方法,创建一个新的对象,并用start()开启进入就绪状态。
例子:创建两个线程,两个线程的功能分别为输出100以内的偶数和奇数,代码如下:
1 public class ThreadTest extends Thread{ 2 public static void main(String[] args) {
//采用匿名内部类创建对象 3 new Thread(){ 4 @Override 5 public void run() { 6 for (int i = 1; i <=100; i++) { 7 if (i % 2 ==0) { 8 System.out.println(Thread.currentThread().getName()+":"+i); 9 } 10 } 11 //yield();-->释放当前cpu的执行权 12 } 13 }.start(); 14 15 new Thread(){ 16 @Override 17 public void run() { 18 for (int i = 1; i <=100; i++) { 19 if (i % 2 !=0) { 20 System.out.println(Thread.currentThread().getName()+":"+i); 21 } 22 } 23 } 24 }.start(); 25 26 27 } 28 }
2.实现Runnable接口,重写run()方法
创建一个类实现Runnable接口,仍然需要使用Thread类
例子:三个窗口卖10张票,三个窗口相当于三个线程
1 class HelloThread implements Runnable{ 2 private int ticket=10; 3 @Override 4 public void run() { 5 while (true){ 6 if (ticket>0) { 7 System.out.println(Thread.currentThread().getName()+":卖票,票号:"+ticket); 8 ticket--; 9 }else{ 10 break; 11 } 12 } 13 } 14 } 15 16 public class ThreadTest1 { 17 public static void main(String[] args) { 18 HelloThread helloThread = new HelloThread(); 19 Thread t1 = new Thread(helloThread); 20 Thread t2 = new Thread(helloThread); 21 Thread t3 = new Thread(helloThread);//三个线程公用一个对象,所以共享10张票,但未解决重票问题 22 t1.setName("窗口1:"); 23 t2.setName("窗口2:"); 24 t3.setName("窗口3:"); 25 t1.start(); 26 t2.start(); 27 t3.start(); 28 } 29 }
3.实现Callable接口
创建一个实现Callable接口的类,实现call()方法;用实现Callable接口创建多线程比Runnable接口的好处是Callable接口的call()方法有返回值,call()可以抛出异常,被外操作捕获获取异常信息,Callable支持泛型。
例子:得到1到100之内偶数之和sum
1 import java.util.concurrent.Callable; 2 import java.util.concurrent.ExecutionException; 3 import java.util.concurrent.FutureTask; 4 5 class NewThread implements Callable{ 6 7 @Override 8 public Object call() throws Exception { 9 int sum=0; 10 for (int i = 1; i <=100 ; i++) { 11 if(i%2==0){ 12 System.out.println(i); 13 sum+=i; 14 } 15 } 16 return sum; 17 } 18 } 19 public class ThreadNew { 20 public static void main(String[] args) { 21 NewThread newThread=new NewThread(); 22 //需要创建FutureTask类对象 23 FutureTask futureTask = new FutureTask(newThread); 24 //仍然需要Thread来开启线程 25 new Thread(futureTask).start(); 26 try { 27 //调用get方法得到返回值 28 Object sum = futureTask.get(); 29 System.out.println("总和为:"+sum); 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } catch (ExecutionException e) { 33 e.printStackTrace(); 34 } 35 } 36 }
4.通过线程池创建多线程
线程池用到了两个API:ExecutorService和Executors;Executor类提供了一系列工程方法用于创建线程池,返回的线程池实现了ExecutorService接口
1 //创建一个实现Runnable接口的类ThreadMy 2 class ThreadMy implements Runnable{ 3 4 @Override 5 public void run() { 6 for (int i = 0; i <20 ; i++) { 7 System.out.println(Thread.currentThread().getName()+":"+i); 8 } 9 } 10 } 11 //创建一个实现Runnable接口的类ThreadMy1 12 class ThreadMy1 implements Runnable{ 13 14 @Override 15 public void run() { 16 for (int i = 0; i <50 ; i++) { 17 System.out.println(Thread.currentThread().getName()+":"+i); 18 } 19 } 20 } 21 public class ThreadPool { 22 public static void main(String[] args) { 23 //创建线程池,固定容量为10 24 ExecutorService service = Executors.newFixedThreadPool(10); 25 //执行任务,execute()里需要接收一个实现Runnable接口的类 26 service.execute(new ThreadMy()); 27 service.execute(new ThreadMy1()); 28 //关闭service,停止接受任何新任务并等待已提交的任务完成 29 service.shutdown(); 30 } 31 }
原文:https://www.cnblogs.com/sj-cxy/p/14315883.html