这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
书接上文,上回书我们了解到了何为进程,线程,多线程,如果有同学忘记的话,可以点进传送门juejin.cn/post/699291…
今天,要介绍几个新的概念,Thread、Runnable
我们还是从一个小例子入手,假设你现在是一个刚高考完的小朋友,考了666分,现在呐,你想把你的好消息分享给你的idol giegie。
在同时,你的idol giegie打开了围脖,看到了很多他的粉丝小迷妹迷弟给他分享好成绩,这位宠粉的giegie很想回消息,but心有余而力不足,所以他找了自己的小助理,帮助他去回复小粉丝,好了,故事讲到这里happy ending~
在这个故事里,giegie就是Thread,他只能回复一个微博,毕竟大明星日理万机,so他去找了小助理帮助他完成任务,在这里小助理就是Runnable,去帮助giegie完成回复微博的内容,不是一个微博了,而是很多的微博了。
下面用代码来实现这几个程序
Thread
代码实现
public class Giegie extends Thread{
@Override
public void run() {
for(int i = 0;i<20;i++){
System.out.println("巡演"+i);
}
}
public static void main(String[] args) {//主线程
ThreadT t = new ThreadT();
//t.run();//调用方法
t.start();//开启线程
for(int i = 0;i<20;i++){
System.out.println("回围脖"+i);
}
}
在这个程序中,重写的方法是自己手动写的。在我们的java里,只能进行单继承,不可取之,故要找实现类去帮助自己去完成多项任务。
【注意】 .start() //开启线程,如果没有这个方法,就没有办法实现多线程的操作
运行结果
巡演+i和 回围脖 +i 按照不确定的顺序进行输出
(其中:不确定的这一点是因为,线程是由CPU进行调度的,所以我们无法人为进行控制)
Runnable
代码实现
public class Giegie1 implements Runnable{
//Thread.currentThread().getName():获取这个线程的名字
@Override
public void run() {
for(int i = 0;i<50;i++){
System.out.println(Thread.currentThread().getName()+"写签名照"+i);
}
}
public static void main(String[] args) {
RunnableT r = new RunnableT();
/*Thread t = new Thread(r);
t.start();*/
new Thread(r,"11").start();
new Thread(r,"22").start();
new Thread(r,"33").start();
for(int i = 0;i<50;i++){
System.out.println("看剧本"+i);
}
}
运行结果
// 看剧本和写签名照交替的进行输出
在这里,我们对比一下Runnable和Thread,Runnabel下面的@Override直接重写出来的,可以自动的生成出,更好的实现。
但是这里我们会发现最后输出的内容有一定的重复,这称之为线程的并发,这个问题的出现,不是我们代码的问题,而是CPU的调度问题。
现在我们也发现了,在这里我们启动了线程。在我们的大自然中,所有的事物都秉承着物极必反,月盈则亏的原则,你的线程不可能一直的启动,终有关闭之时,那么我们如何让线程进行关闭呐?线程的转化状态又是什么样子的呐?
且听下回分解。