Java多线程两种实现

来源:互联网 发布:专业的剪辑软件 编辑:程序博客网 时间:2024/06/06 01:36

在java中实现多线程的方式有两种,一种是继承Thread类,另一个是实现Runnable接口。

对于两种实现,各有优缺点。接下来进行对比总结一下。这两种方法,都可以实现多线程。

以下为两种实现的写法


继承Thread类的方式:

package com.zc.thread;public class MyThread extends Thread {private String name;public MyThread(String name) {super();this.name = name;}public void run() {for (int i = 0; i < 10; i++) {System.out.println("线程开始:" + this.name + ",i=" + i);}}}


实现Runnable接口的方式:

package com.zc.runnable;public class MyRunnable implements Runnable {private String name;public MyRunnable(String name) {this.name = name;}public void run() {for (int i = 0; i < 10; i++) {System.out.println("线程开始:" + this.name + ",i=" + i);}}}

两种方式都可以实现多线程。两种方式的区别基本就是 继承 和实现接口的区别。初次之外,就是实现Runnable接口可以实现资源的共享。

对于继承Thread类,会有一些局限性。因为java中的类不能继承多个类,但是可以实现多个接口。所以实现Runnable多少会有一些便利。


因为这两种方式,就是换汤不换药。Thread类仍然是实现的Runnable接口。



run方法 和 start方法区别:

在以上两种实现多线程的方式中,都需要重写run方法。而要想启动线程,就必须调用该类的start方法。这样JVM才会给分配一个线程。进而实现 多线线程的同步执行。即:start会协调系统的资源。


那么如何实现,多个线程之间的资源共享呢?

首先编写一个自己的Test类

package com.zc.thread;public class SellThread extends Thread{private int ticket = 10;@Overridepublic void run() {for (int i = 0; i < 20; i++) {if (this.ticket > 0) {System.out.println("卖票:ticket" +",第"+ this.ticket--);}}}}


该类为一个售票点的运营情况。

如果只有一个售票员的话,那么这个问题就不需要讨论了,这样就是一个单一的线程。直接用即可。

那么如何实现三个售票员的情况呢?接下来看一下下面这种情况:

public class ticketTest {public static void main(String[] args) { TicketSellThread tst1=new TicketSellThread(); TicketSellThread tst2=new TicketSellThread(); TicketSellThread tst3=new TicketSellThread(); tst1.start(); tst2.start(); tst3.start();}}

上面的这种情况是否可以满足 三个售票员的售票点呢?




很显然,售票的情况不对,三个售票员 售出了 总数 那么多的票,是三个人的资源 不共享造成的。


要想实现,三个售票员同享一个资源。那么就应该用同一个Thread去start  三个线程。

public static void main(String[] args) {        TicketThreadR ticketThread = new TicketThreadR();                Thread th1 = new Thread(ticketThread);    //线程一        Thread th2 = new Thread(ticketThread);    //线程二        Thread th3 = new Thread(ticketThread);    //线程三                th1.start();        th2.start();        th3.start();    }

接下来看一下结果:



虽然打印情况不是按照顺序打印的,但是实现了资源共享。

对比来说,实现Runnable类的Thread进行start的时候,会达到资源共享。而如果使用继承Thread的实现方法来调用start资源是得不到共享的。


0 0
原创粉丝点击