多线程

多线程

1.什么是线程

它是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

而多线程是为了充分利用cpu资源提高效率

2.如何在java中创建多线程

它有两种方式:

  1. 继承Thread类

    public class MyThread extends  Thread {
    
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                System.out.println(this.getName()+"------------------"+i);
            }
    
        }
    }
    
            //新建线程对象
            MyThread m1  = new MyThread();
            //开启线程
            m1.start();
    
  2. 实现Runnable接口

public class MaiPiao implements Runnable{
    private  int num=100;
    public void run() {
      while (true){            
              if (num > 0) {
                  num--;
                  System.out.println(Thread.currentThread().getName() + "卖出了一张剩余" + num + "张");
              } else {
                  break;
              } 
         }
    }
}
        //新建任务对象
        MaiPiao m  = new MaiPiao();
        //新建线程对象接收
        Thread t1 = new Thread(m);
        //开启线程
        t1.start();

其中getName()为获取线程名方法。

java只允许单继承,但是可以实现多个接口。 选择第一种继承Thread方式,那么他就无法继承别的类,不利于扩展。

3.Thread线程类中常用方法


//休眠  
//当前线程主动休眠一段时间单位为毫秒
public static void sleep(long millis)
//放弃
//主动放弃当前抢夺到的时间片,竞争下一次时间片
public static void yield()
//加入  
//允许其他线程加入当前线程,执行完之后才会执行当前线程
public final void join()
//获取当前线程
.currentThread() 
//优先级
//默认为5 分为10~0 值越大抢到时间片的概率越高
.setPriority()
//守护线程
//线程有两类:用户线程(前台线程)和守护线程(后台线程)
//如果程序中所有前台线程都执行完毕了,后台线程也会自动结束(无论后台线程是否执行完毕)。
.setDaemon(true)

4.线程安全

当多个线程共享一个资源时,可能会出现线程安全问题。

一个线程正在访问数据,并且对数据进行了修改,而这种修改还没有提交,另外一个线程也访问这个数据,然后使用了这个数据

如何解决线程安全问题? ----使用锁。--->凡是用锁 锁定的代码都是原子操作。

第一种自动锁: synchronized(共享数据)

public class MaiPiao implements Runnable{
    private  int num=100;
    public void run() {
      while (true){
          synchronized (this) {
              if (num > 0) {
                  num--;
                  System.out.println(Thread.currentThread().getName() + "卖出了一张剩余" + num + "张");
              } else {
                  break;
              }
          }
      }
    }
}

第二种手动锁: Lock

public class MaiPiao implements Runnable{
    private Lock l=new ReentrantLock();
    private  int num=100;
    public void run() {
      while (true){
               l.lock();
              if (num > 0) {
                  num--;
                  System.out.println(Thread.currentThread().getName() + "卖出了一张剩余" + num + "张");
              } else {
                  break;
              }
            l.unlock();
      }
    }
}

posted @ 2023-08-15 09:50    阅读(32)  评论(0)    收藏  举报