Java多线程的两种实现方式

多线程的两种实现方式和区别

       使用Runnable接口与Thread类对比,解决了单继承定义的局限。

1. Thread类的定义

public class Thread extends object implements Runnable{};

Thread实现了Runnable接口

使用了Ruunable接口比Thread类能更好的描述出数据共享的概念-->多线程访问同一资源的操作.


Java多线程的两种实现方式

             调用run()方法的核心     

用start()方法调用run()方法启动线程

Demo: (每个线程由start()启动)

 class MyThread extends Thread{

    privateint tickets = 10;

    @Override

    publicvoid run(){

       for(int i = 0; i < 100;i++){

           if(this.tickets>0)

           System.out.println("tickets: "+ this.tickets--);

       }

    }

}

publicclass TestDemo_01 {

    publicstaticvoid main(String[] args){

       MyThread m1 = new MyThread();

       MyThread m2 = new MyThread();

       MyThread m3 = new MyThread();

       m1.start();

       m2.start();

       m3.start();

    }

}           
Java多线程的两种实现方式      
(不好意思,下面在word文档上复制错误)                     

栈内存

  M1

  m2

  m3

堆内存

ticket=10

  ticket=10

  ticket=10



 2.利用Runnable接口继承实现

class MyThread implements Runnable{

    privateint tickets = 10;

    @Override

    publicvoid run(){

       for(int i = 0; i < 100;i++){

           if(this.tickets>0)

           System.out.println("tickets: "+ this.tickets--);

       }

    }

}

 

publicclass TestDemo_01 {

    publicstaticvoid main(String[] args){

       MyThread mt = new MyThread();

       new Thread(mt).start();

       new Thread(mt).start();

       new Thread(mt).start();

    }

}

三个Thread类对象,占用了一个Thread对象的构造方法

       都直接占了同一个MyThread类对象的引用

       三个target指向同一个mt对象,可访问同一个线程的数据资源
Java多线程的两种实现方式

栈内存

mt

new Thread(mt)

new Thread(mt)

new Thread(mt)

堆内存

Tickets=10

target

target

target


Thread类是Runnable接口的子类

使用Ruunable接口实现多线程可避免单继承的局限

Runnable接口实现了多线程比Thread更清楚的描述了数据资源共享

 

取得线程名称,可使用Thread类的方法

       ·构造方法:public Thread(Runnable target, String name);

       ·public final void setName(String name);

       ·public final void getName(String name);

取得线程名字的操作,必须是当前执行的线程名字

Demo :

package www.thread.com;

 

classMyThread_03implementsRunnable{

    @Override

    publicvoidrun(){

       /*Thread类里提供了一个方法,取得当前线程对象*/

       System.out.println(Thread.currentThread().getName());

    }

}

 

publicclassTestDemo_03{

    publicstaticvoidmain(String[]args)throws Exception{

       MyThread_03mt = newMyThread_03();

       newThread(mt,"线程A").start();

       newThread(mt).start();

       newThread(mt,"线程B").start();

       newThread(mt).start();

       newThread(mt).start();

       mt.run();     //直接调用run()方法

    }

}

在实例化Thread类对象没设名字,则自动设置线程编号,保证每个线程对象不重复

主方法就是一个线程(main线程),所有在主方法是创建的线程都可以是子线程

每使用Java命令去解释一个程序类时,操作系统相当于启动了一个新的进程

而main只是一个新进程的子进程

每一个JVM进程启动时至少启动两个线程

       ·main线程:线程的主要执行,以及启动子线程

       ·gc线程:负责垃圾收集