理解面向对象编程(三)-线程、死锁

本文介绍了Java中线程的基本概念,包括线程与进程的区别、线程的创建方式、线程控制方法如sleep和join的使用、线程优先级设置、线程同步机制以及死锁现象。通过具体实例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

* 1.线程和进程的区别

    线程是程序中的不同执行路径

    java.lang.Thread

    方法:继承Thread或者实现Runnable接口,

    线程启动:Thread的start()方法

    调用该Runnable 对象的 run 方法和调用Thread的start方法本质区别:

    newThread(new Runner1()).start();

    newRunner1().run();

    start方法是启动线程,和main方法是并行运行

    runnable的run()是main执行到此,停下来,等run方法执行完再接着执行

    因此有本质的区别

    例子:

 

   publicclass test2 {
   
       publicstatic void main(String[] args) {
           //实现Runnable接口,推荐
           //newThread(new Runner1()).start();
           //newRunner1().run();
           //继承Thread类
           //newRunner1().start();
           for(inti=0;i<100;i++){
              System.out.println("Thread"+i);
           }
       }
    }
    //classRunner1 implements Runnable{//实现Runnable接口
    classRunner1 extends Thread{//继承Thread类
       @Override
       publicvoid run() {
           for(inti=0;i<100;i++){
              System.out.println("Runner"+i);
           }
       }
    } 

 *2.sleep方法/join方法/yield方法

    Thread.sleep()

    join相当于方法调用,等着子线程执行完,main才开始

    yield,让出cpu,给其他线程执行机会

 * 3.线程的优先级

    setPriority(Thread.MAX_PRIORITY)

 * 4.线程同步

    经典的例子:

  

  public class Test4 implements Runnable{
       Timertimer=new Timer();
       publicstatic void main(String[] args) {
           Test4test=new Test4();
           Threadt1=new Thread(test);
           Threadt2=new Thread(test);
           t1.setName("t1");
           t2.setName("t2");
           t1.start();
           t2.start();
       }
       @Override
       publicvoid run() {
           timer.add(Thread.currentThread().getName());
       }
    }
   
    classTimer{
       privatestatic intnum=0;
       //publicvoid add(String name){
       publicsynchronized void add(String name){//锁定当前对象
           num++;
           try{
              Thread.sleep(1);
           }catch(InterruptedExceptione){}
           System.out.println(name+"Thisis"+num+"Thread with timer");
       }
    }

 * 5.死锁例子

    

public class Test5  implements Runnable{
       privateintflag=1;
       staticObject o1=new Object();
       staticObject o2=new Object();
       publicstatic void main(String[] args) {
           Test5test1=new Test5();
           test1.flag=1;
           Test5test2=new Test5();
           test1.flag=0;    
           Threadt1=new Thread(test1);
           Threadt2=new Thread(test2);
           t1.start();
           t2.start();
       }
   
       @Override
       publicvoid run() {
           if(flag==1){
              synchronized(o1) {
                  try{
                     Thread.sleep(1000);
                  }catch(InterruptedExceptione){}
              }
              synchronized(o2) {
                  System.out.println("1");
              }
           }
           if(flag==0){
              synchronized(o2) {
                  try{
                     Thread.sleep(1000);
                  }catch(InterruptedExceptione){}
              }
              synchronized(o1) {
                  System.out.println("1");
              }
           }
          
       }
   
    }

   

 * 6.加了synchronized的方法可以访问其他没有加锁的线程,但是其他线程访问不了这个加了synchronized的方法

* 7.停掉一个线程,用new Thread().join()//关键

8.sleep和wait区别

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DYanchao2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值