第一种方式 继承于Thread类
public class MyThread extends Thread { @Override public void run() { //执行的方法,实现所需的功能 int i=10; do { System.out.println("线程启动"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i++; }while (i<4); } }
测试
public class Main { public static void main(String[] args) { //第一种方式 new MyThread().start();//创建并启动 } }
第二种方式 实现Runnable接口
public class MyThread2 implements Runnable { @Override public void run() { int arr[] = {1,2,3}; //增强for for(int i : arr){ System.out.println("数值为=="+i); } } }
测试
public class Main { public static void main(String[] args) { //第二种方式 MyThread2 myThread2 = new MyThread2(); Thread thread=new Thread(myThread2); thread.start(); } }
第三种方式 通过匿名内部类的方式创建
public class MyThread3 { //使用匿名内部类的方式创建 public static void main(String[] args) { //第一种方式 继承Thread类 重写run方法 // new Thread(){ // @Override // public void run() { // // for (int i = 0; i<5 ;i++){ // System.out.println("i的数值是==="+i); // } // // } // }.start(); //第二种方式 实现runnbale接口 new Thread(new Runnable() { @Override public void run() { for (int i = 0; i<5; i++){ System.out.println("i的数值是=="+i); } } }).start(); } }
第四种方式 使用Callable接口实现类并实现call方法
public class Demo { public static void main(String[] args) throws Exception { //创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例 Callable<Integer> call = new Callable<Integer>() { @Override public Integer call() throws Exception { System.out.println("计算1+......100的和"); int sum =0; for (int i=1;i<=100;i++){ sum+=i; } Thread.sleep(1000); System.out.println("----结果是----"); return sum; } }; //使用FutureTask类来包装Callable对象 FutureTask<Integer> task = new FutureTask<>(call); Thread thread = new Thread(task); //启动线程 thread.start(); System.out.println("拿到的结果是==="+task.get()); } }
注意的点 创建两个线程
public class MyThread4 extends Thread{ private int ticket = 5; @Override public void run() { while (true){ if (ticket>0){ System.out.println("当前执行的线程名称是: "+Thread.currentThread().getName()+" 出票数是:"+ticket--); }else { System.exit(0); } } } }
测试方式一:
public static void main(String[] args){ //报出异常,是因为同一个Thread不能重复调用start方法 //并且执行的结果来看只运行了一个线程,说明每创建一个Thread对象,只能够创建一个线程 /* Exception in thread "main" java.lang.IllegalThreadStateException 当前执行的线程名称是: Thread-0 出票数是:5 当前执行的线程名称是: Thread-0 出票数是:4 当前执行的线程名称是: Thread-0 出票数是:3 当前执行的线程名称是: Thread-0 出票数是:2 当前执行的线程名称是: Thread-0 出票数是:1 */ Thread t1= new MyThread4(); t1.start(); t1.start(); }
测试方式二
public static void main(String[] args){ //从执行的结果来看,创建了两个线程对象,各自执行自己的互不影响 /* 当前执行的线程名称是: Thread-0 出票数是:5 当前执行的线程名称是: Thread-0 出票数是:4 当前执行的线程名称是: Thread-0 出票数是:3 当前执行的线程名称是: Thread-0 出票数是:2 当前执行的线程名称是: Thread-0 出票数是:1 当前执行的线程名称是: Thread-1 出票数是:5 当前执行的线程名称是: Thread-1 出票数是:4 当前执行的线程名称是: Thread-1 出票数是:3 当前执行的线程名称是: Thread-1 出票数是:2 当前执行的线程名称是: Thread-1 出票数是:1 */ new MyThread4().start(); new MyThread4().start(); }
测试方式三
public static void main(String[] args){ //启动四个线程,并实现资源共享的目的 /* 当前执行的线程名称是: Thread-1 出票数是:5 当前执行的线程名称是: Thread-2 出票数是:4 当前执行的线程名称是: Thread-1 出票数是:3 当前执行的线程名称是: Thread-3 出票数是:1 当前执行的线程名称是: Thread-2 出票数是:2 */ MyThread4 t = new MyThread4(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); }