从零基础接触java第七周第一节

  上一节跟大家分享了多线程,然后那只是多线程的冰山一角,接下来继续与大家分享多线程。

  上一节跟大家说到,多线程必须继承一个Thread类,然后实现里面的run方法,最后通过调用Thread里面的start()方法实现。所谓的多线程就好比买票,我们把一个进程分成几个线程来运行,这样加快了进程的速率。由此可看,进程和线程好比分子与物体的关系,物体由分子组成,那么一个进程也就由多个线程组成。简单地说就是我们的一个程序便是一个进程,我们进程的运行,就需要多个线程来支持。

  这一节继续来跟大家分享多线程,那么如果大家仔细地用过Thread方法的话,那么一定会发现,Thread方法有个bug,那么就是,如果我们想要共同运用一个对象,那么我们便无从下手了,比如以下代码:

public class Test{
public static void main(String[] args){
Conductor c = new Conductor("卖票员1");
Conductor c1 = new Conductor("卖票员2");
c.start();
c1.start();
}
}
class Conductor extends Thread{
String name;
int i = 100;
public Conductor(){}
public Conductor(String name){
this.name = name;
}
public void run(){
while(i>0){
System.out.println(name+"卖出第"+(i--)+"张票。");
}
}
}

列如以上代码,我们定义了一个卖票的类,我们的i代表的是我们想要卖一百张票,但是我们在主函数雇佣了两个卖票员来卖票,我们明明想要卖出一百张票,但是这个程序却让我们卖出了两百张票,所以我们大概能猜到,这便是我们new了两个对象的原因,从而开辟了两个空间,两个卖票员在各卖各的票,不仅重复卖票,还卖了两百张。于是在我们java中,运用了一个叫runnable的接口来解决这个方法,代码如下:

public class Test{
public static void main(String[] args){
Conductor c = new Conductor();
Thread t1 = new Thread(c,"卖票员1");
Thread t2 = new Thread(c,"卖票员2");
t1.start();
t2.start();
}
}
class Conductor implements Runnable{
int i = 100;
public void run(){
while(i>0){
System.out.println(Thread.currentThread().getName()+"卖出第"+(i--)+"张票。");
}
}
}

列如以上代码,我们将继承的Thread改为runnable,别忘了继承接口用implements,然后我们将冗余的代码删去了,留下了票数100和卖票的run方法,主函数中我们只定义了一个对象,然后调用Thread方法来接收对象c,再调用star方法,这儿我们可以发现,程序便会只卖出一百张票了,分别是由售票员1和2分开卖的,代码中我们调用Thread方法时还传入了售票员1和2的字符串,然后Thread.currentThread().getName()这段代码就表示传出那个售票员的字符串。那么现在我们已经让一个多线程能够只是单独的调用一个对象来完成进程了,但是,如果我们将程序多运行几次,会发现有时会出现卖出两个100张票的情况,这是我们就会感觉尴尬了,怎么会卖出101张票呢,怎么会多出一张呢?别急,本节的内容已经完毕,下一节小编会继续与大家分享多线程。

  关于多线程,也是小编认为最难的一个部分,所以下来还希望大家多多敲一敲小编代码去理解,也方便以后学习,毕竟代码是敲会的,不是看会的。小编希望本节能让大家初步理解,如果大家下来发现小编有错误,或者以后学习中发现有分析,还希望在评论中提出,毕竟代码没有绝对的正确与安全。本节的讲解完毕,感谢大家的观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值