多线程


多线程

概念:

Windows操作系统是多任务操作系统,它以进程为单位。每个独立执行的程序被称为一个进程,而每个进程又包含多个线程。系统可以分配给每个进程一段使用CPU的时间(CPU时间片),CPU在这段时间中执行某个进程,同理线程也会被分配一小段时间,进行并发执行线程

线程具有生命周期,其中包括五个状态,分别为出生状态,就绪状态,运行状态,暂停状态(休眠/等待/阻塞)和死亡状态

五种状态

  • 出生状态

    被创建时的状态称为出生状态

  • 就绪状态

    当线程对象调用starts()方法后进入就绪状态

  • 运行状态

    当线程得到系统资源后进入运行状态。

    线程一旦进入运行状态,就会在就绪与运行状态下转换,同时也也可能进入暂停或死亡状态。

  • 暂停状态

    当在运行状态下调用sleep()方法,wait()方法或者发生阻塞时,就会进入暂停状态。

    当在休眠结束,或者调用notify()或notifyAll( )方法,或者阻塞解除时,线程会重新进入就绪状态

  • 死亡状态

    当线程的run()方法执行完毕,或者线程发生错误,异常时,线程进入死亡状态

两种方法

继承Thread类

public class ThreadTest {
   public static void main(String[] args) {
       new Thread( new MyThread(),"A").start();
  }
}

class MyThread extends Thread{
   private int num=10;
   @Override
   public void run() {
       while(true){
           System.out.println(Thread.currentThread().getName()+" : "+num);
           num--;
           if(num<0){
               break;
          }
      }
  }
}

 

实现Runnable接口

public class RunnableTest {
   public static void main(String[] args) {
        new Thread(new MyRunnable(),"A").start();
  }
}
class MyRunnable implements Runnable{
private int number=10;
   @Override
   public void run() {
       while (true) {

           System.out.println(Thread.currentThread().getName()+" : "+number);
           number--;
           if (number<=0){
               break;
          }
      }
  }

线程的休眠 Sleep( )

sleep()方法可以指定线程的休眠时间,线程的休眠时间以毫秒为单位

Thread.sleep(100);
public class SleepTest {
   public static void main(String[] args) {
       MyThread01 myThread01 = new MyThread01();
       new Thread( myThread01,"A").start();
  }
}
class MyThread01 implements Runnable{
        private int number=10;
   @Override
   public void run() {
       while (true) {
           try {
               Thread.sleep(1000);
          } catch (InterruptedException e) {
               e.printStackTrace();
          }
           System.out.println(Thread.currentThread().getName()+":"+number);
           number--;
           if(number<0){
               break;
          }
      }
  }
}

线程的等待死亡(强行插队)方法join( )

join( )方法,等待线程死亡

public class JoinTest {
   public static void main(String[] args) throws InterruptedException {
       Thread thread = new Thread(new MyRunnable01());
       thread.start();
       for (int i = 0; i <50;i++){
           if(i==20){
               thread.join();
          }
           System.out.println("正在执行主线程任务");
      }
  }
}
class MyRunnable01 implements Runnable{
   @Override
   public void run() {

       for (int i=0;i<20;i++){
           System.out.println("join()方法强行插队");
      }
  }
}

线程的礼让Yield()

yield()方法,线程的礼让:1.让当前执行的线程暂停,但不阻塞 2.让cpu重新调度,但不一定礼让成功

public class TestYield implements Runnable {
   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName()+"线程启动");
      Thread.yield();
       System.out.println(Thread.currentThread().getName()+"线程停止");
  }
   public static void main(String[] args) {
       TestYield testYield = new TestYield();
       new Thread(testYield,"A").start();
       new Thread(testYield,"B").start();
  }
}

 

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/245225.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论