Java多线程的两种实现方式

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

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

1. Thread类的定义

public class Thread extends object implements Runnable{};

Thread实现了Runnable接口

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


             调用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();

    }

}            
      
(不好意思,下面在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对象,可访问同一个线程的数据资源

栈内存

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线程:负责垃圾收集

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值