十六、线程

本文介绍了Java中实现多线程的两种方法:通过实现Runnable接口和继承Thread类。此外,还详细讲解了线程的睡眠方法sleep()、暂停当前线程让出CPU给其他线程的yield()方法,以及通过synchronized关键字实现线程同步防止数据竞争的用法,并通过一个具体的死锁案例展示了线程同步不当可能导致的问题。

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

写多线程的两种方法     (多线程)    之前写的程序都是单线程的(只有一条执行路径)


1.public class Helloworld1 {                          //第一种方法(实现Runnable接口)更好,能继承,又能实现尽量实现(实现了之后,还能继承)
 public static void main(String args[]) {
   Thread t1 = new Thread(new T("t1"));
   Thread t2 = new Thread(new T("t2"));
   t1.start();                                 //只有Thread里面的start()方法,才叫做开启线程
   t2.start();
  }
 }
 class T implements Runnable {                 //实现了Runnable接口的都是线程类
  String n;
  public T(String n) {
   this.n = n;
    }
     public void run() {        //方法的重写,重写接口Runnable里面的run()方法
      for(int i=1;i<=100;i++) {
       System.out.println(n+": "+i);
     }
   }
  }

2.public class Helloworld1 {                            //第二种方法(继承Thread类)
 public static void main(String args[]) {
   T t1 = new T("t1");
   T t2 = new T("t2");
   t1.start();
   t2.start();
  }
 }
 class T extends Thread {
  String n;
  public T(String n) {
   this.n = n;
    }
     public void run() {
      for(int i=1;i<=100;i++) {
       System.out.println(n+": "+i);
     }
   }
  }
....................................................................................................................................
线程的睡眠方法       (lang包底下Thread类里面的sleep()方法)

public class Helloworld1 {
 public static void main(String args[]) {
   T t1 = new T("t1");
   t1.start();
  }
 }
 class T extends Thread {
  String n;
  public T(String n) {
   this.n = n;
    }
     public void run() {
      for(int i=1;i<=100;i++) {
       try {if(i % 50 == 0) {            //sleep()方法会报编译期异常,要加上try-catch
        Thread.sleep(3000);       //sleep()方法可以加上睡眠时间,单位毫秒
       }}catch (Exception e) {
        }
       System.out.println(n+": "+i);
     }
   }
  }
....................................................................................................................................
暂停当前线程对象,并执行其他线程     (lang包底下Thread类里面的yield()方法)

public class Helloworld1 {
 public static void main(String args[]) {
   T t1 = new T("t1");
   T t2 = new T("t2");
   t1.start();
   t2.start();
  }
 }
 class T extends Thread {
  String n;
  public T(String n) {
   this.n = n;
    }
     public void run() {
      for(int i=1;i<=100;i++) {
       try {if(i % 10 == 0) {               //当t1(t2)到10的倍数时,执行t2(t1)
        Thread.yield();              //yield()方法和上面的sleep()方法一样,都是静态的方法
       }}catch (Exception e) {
        }
       System.out.println(n+": "+i);
     }
   }
  }
....................................................................................................................................
*(重点程序) 线程死锁(由于两边加上同步锁既只读锁,然后又去访问对方加锁的对象造成的)     (synchronized()只读锁)

public class Helloworld1 {
 public static void main(String args[]) {
  Thread t1 = new Thread(new T("t1",1));
  Thread t2 = new Thread(new T("t2",2));
  t1.start();
  t2.start();
  }
 }
 class T implements Runnable {
  static Object o1 = new Object();           //一定要加上static,要不然程序会再新建一个o1,o2
  static Object o2 = new Object();
  String n;
  int flag;
  public T(String n,int flag) {
   this.n = n;
   this.flag = flag;
   }
   public void run() {
    if(flag == 1) {
     synchronized(o1) {                              //synchronized关键字
      System.out.println("o1");
      synchronized(o2) {                        //在o1的只读锁还没解锁时,就对o2进行访问
       System.out.println("o2");
       }
      }
     }
     if(flag == 2) {
      synchronized(o2) {
       System.out.println("o2");
       synchronized(o1) {
        System.out.println("o1");
        }
       }
      }
    }
  }

转载于:https://www.cnblogs.com/jianzhi20093120/archive/2012/07/17/2596618.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值