线程创建有两个方法:
- 创建Thread或者其子类
- 执行start()方法
创建线程的方法也有两个:
一、实现Runnable接口的run方法
1 public class ThreadTest implements Runnable { 2 3 @Override 4 public void run() { 5 for (int i = 0; i < 100; i++) 6 System.out.println(Thread.currentThread().getName() + "........"+i); 7 8 } 9 10 public static void main(String[] args) {11 ThreadTest aa = new ThreadTest();12 ThreadTest bb = new ThreadTest();13 Thread t1 = new Thread(aa);14 Thread t2 = new Thread(bb);15 t1.start();16 t2.start();17 18 19 }20 21 }
二、继承Thread类重写run方法
1 public class ThreadExtendsTest extends Thread { 2 3 ThreadExtendsTest(String name) { 4 super(name); 5 } 6 7 @Override 8 public void run() { 9 for (int i = 0; i < 100; i++) {10 System.out.println(this.getName() + "..." + i);11 }12 }13 14 public static void main(String[] args) {15 ThreadExtendsTest aa = new ThreadExtendsTest("aa");16 ThreadExtendsTest bb = new ThreadExtendsTest("bb");17 aa.start();18 bb.start();19 }20 21 }
其它:多个线程共享同一份资源
1 public class ThreadTest implements Runnable { 2 private int count = 300; 3 4 @Override 5 public void run() { 6 for (int i = 0; i < 100; i++) 7 System.out.println(Thread.currentThread().getName() + "........" + count--); 8 } 9 10 public static void main(String[] args) {11 ThreadTest aa = new ThreadTest();12 Thread t1 = new Thread(aa);13 Thread t2 = new Thread(aa);14 Thread t3 = new Thread(aa);15 t1.start();16 t2.start();17 t3.start();18 19 }20 21 }
注意:
- 两个线程的执行时间并不是平均分配的,而是根据JVM调度的。
- Thread类中有带线程名值的创建方法,而且如果不创建名字,系统也会自动生成线程名称。
- 当两个线程都执行start()方法之后,同时在跑的有三个线程,当两个副线程的run()方法执行完毕以后,结束线程并且只剩下一个主线程。