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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值