start()和run()的区别

本文详细解释了Java中Runnable接口实现多线程时,start()与run()方法的作用,强调了start()启动新线程并进入就绪队列的过程,以及不使用start()直接调用run()的不同执行行为。通过实例展示了线程调度和时间片原理。

本方法通过实现runnable接口来实现多线程,刚开始被run()和start()搞糊涂了,后来看了很多博客,稍有感悟。所以写一下自己的理解。start()方法让一个线程进入就绪队列等待分配cpu,分到cpu后才调用实现的run()方法。

若不使用start()直接在main方法中直接使用run()方法, 比如下面程序的前两种情况,因为没有开辟新的线程,所以当前线程是main线程,而第三种情况,开辟了一个新线程且线程名我们设置为了“新线程”,在cpu执行新线程时会调用run()方法。

package javaNewThread;
public class test1main {
	public static void main(String[] args) {
		runnable runner=new runnable();
		Thread th1= new Thread(runner,"新线程");
		
//区分以下三种情况
        
        //1
		System.out.println("th1.run():");
		th1.run();
		//2
		System.out.println("runner.run():");
		runner.run();
		//3
		System.out.println("th1.start():");
		th1.start();
	}
}
public class runnable implements Runnable{
	private int food=10;
	public void run() {
		for(int i=0;i<3;i++) {
			System.out.println("线程名:"+Thread.currentThread().getName()+" food:"+food--);
		}
	}
}

结果:

th1.run():
线程名:main food:10
线程名:main food:9
线程名:main food:8
runner.run():
线程名:main food:7
线程名:main food:6
线程名:main food:5
th1.start():
线程名:新线程 food:4
线程名:新线程 food:3
线程名:新线程 food:2

------------交换123的顺序,查看运行结果

接下来我把3放到1和2前面执行,发现新线程的run()还是最后执行,说明它在就绪队列中排队,并没有这么快执行。而当前正在执行mian线程,每个线程执行都有一个时间片,main线程时间片还没结束,所以23先执行了。等main线程时间片用完,再执行新线程。

package javaNewThread;
public class test1main {
	public static void main(String[] args) {
		runnable runner=new runnable();
		Thread th1= new Thread(runner,"新线程");
		
        //1,原来的3
		System.out.println("th1.start():");
		th1.start();
	    //2
		System.out.println("th1.run():");
		th1.run();
		//3
		System.out.println("runner.run():");
		runner.run();
	}
}
package javaNewThread;
 
public class runnable implements Runnable{
	private int food=10;
	public void run() {
		for(int i=0;i<3;i++) {
			System.out.println("线程名:"+Thread.currentThread().getName()+" food:"+food--);
		}
	}
}

运行结果:

th1.start():
th1.run():
线程名:main food:10
线程名:main food:9
线程名:main food:8
runner.run():
线程名:main food:7
线程名:main food:6
线程名:main food:5
线程名:新线程 food:4
线程名:新线程 food:3
线程名:新线程 food:2

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值