Java中的多线程
Java中有两种方法创建线程:
一、继承Thread类创建线程类,重写父类中的run( )方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class threadA extends Thread { 2 3 public String s; 4 5 //构造方法 6 7 public threadA(String s){ 8 9 this.s = s; 10 11 } 12 13 //重写Thread类中的run()方法 14 15 public void run() { 16 17 for(int i = 0; i < 100; i++) { 18 19 System.out.println("线程A"+s+"<><><><><><>"+i); 20 21 } 22 23 } 24 25 //主函数 26 27 public static void main(String[] args) { 28 29 threadA t1 = new threadA("1"); 30 31 threadA t2 = new threadA("2"); 32 33 t1.run(); 34 35 t2.run(); 36 37 } 38 39 }
上面调用run( )方法只是普通的方法,和我们在类中自己定义的方法一样,是顺序执行的,虽然我们写了两个线程,但是并没有体现出多线程的意义。为了体现多线程,应该使用start( )方法来启动线程,start()方法会自动调用run( )方法。所以上面的代码改为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class threadA extends Thread { 2 3 public String s; 4 5 //构造方法 6 7 public threadA(String s){ 8 9 this.s = s; 10 11 } 12 13 //重写Thread类中的run()方法 14 15 public void run() { 16 17 (int i = 0; i < 100; i++) { 18 19 System.out.println("线程A"+s+"-----------"+i); 20 21 } 22 23 } 24 25 //主函数 26 27 public static void main(String[] args) { 28 29 hreadA t1 = new threadA("1"); 30 31 threadA t2 = new threadA("2"); 32 33 t1.start(); 34 35 t2.start(); 36 37 } 38 39 }
通过start( )方法启动的线程。不管t1.start( )调用的run( )方法是否执行完,都继续执行t2.start( )。如果下面有别的代码也同样不需要等待t2.start( )执行完而继续执行。
通过继承Thread的方法创建线程,启动线程只需创建本类对象,调用start()方法即可。
二、实现Runnable接口创建线程类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class threadB implements Runnable { 2 3 public String s; 4 5 //构造方法 6 7 public thread2(String s){ 8 9 this.s = s; 10 11 } 12 13 //重写run()方法 14 15 public void run() { 16 17 for (int i = 0; i < 100; i++) { 18 19 System.out.println(s+"______"+i); 20 21 } 22 23 } 24 25 //主函数 26 27 public static void main(String[] args) { 28 29 threadB tB1 = new threadB("线程1"); 30 31 threadB tB2 = new threadB("线程2"); 32 33 Thread t1 = new Thread(tB1); 34 35 Thread t2= new Thread(tB2); 36 37 t1.start(); 38 39 t2.start(); 40 41 } 42 43 }
通过实现Runnable接口来创建线程,需要先创建本类对象,再创建线程类对象(因为本类对象不是线程类),将本类对象传入线程类对象中,再调用线程类的start()方法才能开启线程。
一般情况下多采用实现Runnable接口的方法来创建线程,因为一个类只能继承一个类,但是接口可以实现多个。
所谓进程,就是正在运行的程序。进程是资源分配的最小单位。每个进程都有自己独立的地址空间(内存空间),比如我现在打开视频软件,打开之后就启动了一个进程,操作系统会为该进程分配独立的地址空间。当打开另一个软件,又会启动一个进程,操作系统会为新的进程分配新的独立的地址空间。
即:用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。
线程,是进程的一个实体,是cpu调度和分派的基本单位,它比进程小,是可以独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(比如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。线程有就绪,阻塞和运行三种基本状态。
线程--如何使用线程?
在java中一个类要当作线程来使用有两种方法:
1、实现Runnable接口,并重写run函数
2、继承Thread类,并重写run函数
一般情况下推荐使用-----实现Runnable接口,重写run方法来创建线程的方法来使用线程。