实现多线程,有两种方式,一种是继承 Thread 类,一种是实现 Runnable接口。
一. Thread 类
public class Thread extends Object implements Runnable{ }
继承 Thread 实现多线程。
一.一 实现多线程操作
一.一.一 创建类, 继承 Thread
class MyThreadDemo extends Thread { @Override public void run(){ //多线程执行的方法 for(int i=0;i<10;i++){ System.out.println("输出:"+i); } } }
一.一.二 主线程调用
@Test public void runTest2(){ //实例化了两个对象。 MyThreadDemo thread1=new MyThreadDemo(); MyThreadDemo thread2=new MyThreadDemo(); //对同一个,是无法多次启动的。 thread1.start(); thread2.start(); }
运行程序,查看控制台输出:
会发现两个线程会交叉执行。 每一次运行,结果都是不一样的。
注意,调用的时候,是 .start() 方法,而不是 .run() 方法。 如果是 .run()方法的话,那就是调用普通的方法run(), 会依次执行,并不会并发执行。
另外,也要注意, 同一个线程,只能启动一次, 不能重复两次。
@Test public void runTest2(){ MyThreadDemo thread1=new MyThreadDemo(); MyThreadDemo thread2=new MyThreadDemo(); //对同一个,是无法多次启动的。 thread1.start(); //启动了两次,则会报错的。 thread1.start(); }
java.lang.IllegalThreadStateException
一.二 多线程的时机
主程序中的代码,放置在启动之后,才可以触发多线程。
@Test public void runTest3() throws Exception{ //上半部分 for(int i=0;i<10;i++){ System.out.println("主线程输出:"+i); } MyThreadDemo thread1=new MyThreadDemo(); //对同一个,是无法多次启动的。 thread1.start(); //下半部分 /*for(int i=0;i<10;i++){ System.out.println("主线程输出:"+i); }*/ }
注释掉下半部分, 使用上半部分代码,运行程序:
并不会触发多线程。
注释掉上半部分,使用下半部分代码,运行程序:
触发了多线程。
二. Runnable 接口
@FunctionalInterface public interface Runnable { public abstract void run(); }
有一个抽象方法, run()
二.一 Runnnable 接口实现多线程
二.一.一 创建类,实现 Runnable接口
class MyRunnableDemo implements Runnable{ @Override public void run() { for(int i=0;i<10;i++){ System.out.println("输出Runnable:"+i); } } }
二.一.二 主线程调用
@Test public void test1(){ //实例化两次对象 MyRunnableDemo myRunnableDemo1=new MyRunnableDemo(); MyRunnableDemo myRunnableDemo2=new MyRunnableDemo(); //分别放置到不同的线程里面 Thread thread1=new Thread(myRunnableDemo1); Thread thread2=new Thread(myRunnableDemo2); //启动 thread1.start(); thread2.start(); }
运行程序,看控制台输出:
每一次运行,结果都是不一样的。
注意, 线程也可以创建一个 MyRunnableDemo 对象
@Test public void test2(){ //只实例化一次即可 MyRunnableDemo myRunnableDemo1=new MyRunnableDemo(); //将同一个对象,放置到不同的线程里面 Thread thread1=new Thread(myRunnableDemo1); Thread thread2=new Thread(myRunnableDemo1); //启动 thread1.start(); thread2.start(); }
运行程序,同样可以达到多线程的操作。
常常采用,实际化一次对象的形式。