java多线程详细讲解

首先要知道实现java多线程有2种方法,一个是继承Thread类重写run()方法,一个是 实现Runnable接口重写run()方法,执行这个多线程类的方法都是调用start()方法,并且第二种方法才是推荐的

 

方法一:继承Thread类,为了标识正在运行的是哪个线程,我给这个类起个名字name

 

public class Mythread extends Thread{

	private String name = null;
	
	public Mythread(String name) {
		this.name = name;
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("正在执行"+name+"的第"+i+"个数字");
		}
	}
}

 在main中调用这个多线程类,我们多调用几次才叫多线程调用呀(模仿实际项目中多个人访问这个方法)

 

 

 

	public static void main(String[] args) {
		Mythread t1 = new Mythread("A");
		Mythread t2 = new Mythread("B");
		t1.start();
		t2.start();
	}
 

 

 

可以发现线程交替执行

 

 

方法二:实现Runnable接口

 

 

public class Mythread implements Runnable{
	private String name=null;
	public Mythread(String name){
		this.name = name;
	}
	@Override
	public void run() {
		for (int i = 0; i < 500; i++) {
			System.out.println("正在执行"+name+"的第"+i+"个方法");
		}
	}

}

 

 调用时发现这个接口并没有start()方法,但是我们查看Thread这个类发现他有个构造方法里可以传一个Runnable接口

 

public Thread(Runnable r){}

 也就是说Thread类是Runnable接口的实现类。因此调用代码通过Thread类来调用start()方法:

 

 

 

public static void main(String[] args) {
		Mythread m1 = new Mythread("A");
		Mythread m2 = new Mythread("B");
		new Thread(m1).start();
		new Thread(m2).start();
}
 

 

 

 

2种方法的区别和联系:

在实际中我们推荐用方法二,这因为:

1、方法一不能实现多继承(java没有多继承)

2、不能共享资源

例子:实现多个线程卖总共的5张票

用方法一 的代码如下:

 

 

public class Mythread extends Thread{
	private int ticket =  5;
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {// 50次循环,5张票肯定是该卖完了
			if(ticket > 0 ){
				System.out.println("我卖了 票"+ticket--);
			}
		}
	}
}

 调用:

 

public static void main(String[] args) {
		Mythread t1 = new Mythread();
		Mythread t2 = new Mythread();
		t1.start();
		t2.start();
	}

 

 结果在控制台上打印了2*5=10次,也就是每张票卖了2次,这时不行的,下面我们用Runnable接口方式实现卖票:

 

public class Mythread implements Runnable{
	private int ticket =  5;
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			if(ticket > 0 ){
				System.out.println("我卖了 票"+ticket--);
			}
		}
	}
}

 

调用的时候,我们不是多次创建Mythread m = new Mythread(),然后每个执行new Thread(m).start()方法,而是只创建一次,然后多次start这同一个m

 

 

public static void main(String[] args) {
		Mythread m = new Mythread();
		new Thread(m).start();
		new Thread(m).start();
}

 这样就实现了资源共享了

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值