线程创建有两个方法:
- 创建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()方法执行完毕以后,结束线程并且只剩下一个主线程。