Java多线程两种实现

在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;
	@Override
	public 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
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值