Java中多线程总结(上)

java中多线程综合(上)

 

1.两种实现多线程方式的对比

实现式:
public class Example1 {

 public static void main(String[] args) {
  Ticket t = new Ticket();
  Thread t1 = new Thread(t);
  Thread t2 = new Thread(t);
  Thread t3 = new Thread(t);
  Thread t4 = new Thread(t);
  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }

}

class Ticket implements Runnable {
 private int tnum = 100;
 public void run() {
  while (true) {
   if (tnum>0)
   System.out.println(Thread.currentThread().getName() + ".........."
     + tnum--);
  }
 }
}

     虽然建立了四个线程,每个程序调用的都是同一个Ticket对象的中的run()方法,访问都是同一个对象的变量tmun,这样就满足只创建一个资源对象,并且每个线程所运行的都是同一程序的代码。

 

继承式
public class Example2 {

 public static void main(String[] args) {
  Ticket t1 = new Ticket();
  Ticket t2 = new Ticket();
  Ticket t3 = new Ticket();
  Ticket t4 = new Ticket();

  t1.start();
  t2.start();
  t3.start();
  t4.start();
 }

}

class Ticket extends Thread {
 private int tnum = 100;
 public void run() {
  while (true) {
   if (tnum>0)
   System.out.println(Thread.currentThread().getName() + ".........."
     + tnum--);
  }
 }
}

    运行结果每张票都打印了4次,即各个线程各自卖了100张票,而不是去卖共同的100张票。出现这种情况的原因是创建了4个Ticket对象,就相当于创建了4个资源,每个Thread对象都有100张票,每个线程都独立处理自己的资源。

 

    可见,实现Runnable接口相对于继承Thread来说,有如下显著的好处:

    1.适合多个程序代码去处理同一个资源的情况,把线程同步程序代码,数据有效的分离,很好的体现了面向对象的设计思想

    2.可以避免由于java的单继承带来的局限性。在开发中经常碰到这种情况,就是使用一个已经继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,就不能用继承Thread方式,那么就只能采用实现Runnale接口的方式。

 

2,调用start方法和run方法区别?
 
 区别:
 Thread对象调用start()方法
        jvm虚拟机调用线程的tun方法
 

3,线程的随机性的导致的原因?
 
 java虚拟机在计算机中使用的是抢占式的的调度模型,就是优先让可运行池中的优先级高的线程占用线程占用cpu,如果可运行池中的优先级相同,那么就随机选择用一个

线程,使其占用cpu
 

4,线程状态的内容和每一个状态的特点?
 
 新建状态:
 创建一个线程对象后,该线程对象就处于新建状态,此时它不能运行,和其他java对象一样,仅仅由java虚拟机为其分配了内存,没有表现出任何的线程的动态特征
 
 可运行状态:
 单线程调用了start()方法后,该线程就进入了可运行状态,处于可运行状态的线程位于可运行池中,此时它只是具备了运行的条件,能否获得cpu使用权开始运行,还要

等待系统的调动
 
 运行状态
 如果处于运行状态的该线程获得了cpu的使用权,开始执行run()方法中的线程执行体,则该线程处于可运行状态。当一个线程启动后,它不可能一直处于运行状态,系统

会为每一个线程分配一小段时间来处理任务,当线程用完了这段时间,系统就会剥夺该线程占用的cpu资源,让其他线程获得执行的机会。需要注意的是,只有处于可运行状态的线

程才可能转换到运行状态

 

 阻塞状态
 如果线程由于某些原因放弃了cpu资源,暂时停止运行,此线程就进入阻塞或等待状态,是由等待状态转换而来的。

 

 死亡状态

 run()方法正常执行完毕或线程抛出为捕获的异常,线程进入死亡状态。一旦进入死亡状态,线程将不再运行的资格。


5,对创建线程的第二种方式的设计的理解?


 实现Runnable接口相对于继承Thread来说,有如下显著的好处:

 1.适合多个程序代码去处理同一个资源的情况,把线程同步程序代码,数据有效的分离,很好的体现了面向对象的设计思想

 2.可以避免由于java的单继承带来的局限性。在开发中经常碰到这种情况,就是使用一个已经继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,就不能

用继承Thread方式,那么就只能采用实现Runnale接口的方式

   
6,什么时候使用多线程?以及创建线程的目的?
  
 当需要多部分代码同时执行的时候,可以使用


7,线程安全问题表现?原因?解决思想?解决具体的体现?

 线程安全产生的原因:

 1.多个线程在操作共享数据。
 2.操作共享数据代码有多条。

 当一个线程在操作共享数据的多条代码的过程中,其他线程参与了运算。就会产生线程的安全问题。

 

 解决思路:
 就是将多条操作共享的数据封装起来,当有线程在执行这些代码的时候,其他线程是不可以参与运算的。
 必须要当前线程把这些代码都执行完毕后,其他线程才可以参与运算。


8,同步的好处,弊端,前提?

 同步的好处:解决了线程的安全问题。

 同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。

 同步的前提:同步中必须有多个线程并使用同一个锁。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值