首页 > 其他分享 >多线程

多线程

时间:2023-08-15 10:03:08浏览次数:38  
标签:Thread void num 线程 多线程 public

多线程

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();
      }
    }
}

标签:Thread,void,num,线程,多线程,public
From: https://www.cnblogs.com/fafwfw/p/17630531.html

相关文章

  • java高级之多线程
    1.什么是多线程首先引入程序与进程概念:程序(program)程序是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码(还没有运行起来),静态对象。进程(process)进程是程序的一次执行过程,也就是说程序运行起来了,加载到了内存中,并占用了cpu的资源。这是一个动态的过......
  • 汪文君->多线程教程
    汪文君-多线程教程第一阶段多线程介绍多线程编程入门多线程创建与启动以及线程状态Runnable接口详细详解线程优先级以及守护线程详解线程同步线程间通讯线程组详解自运行对象详解线程异常回调线程池详解等待线程完成任务阻塞io和多线程详解如何优雅的结束线程自定......
  • 多线程
    多线程1.概述程序是指令和数据的有序集合,是一个静态的概念进程是执行程序的一次执行概念,是一个动态的概念线程是CPU调度和执行的单位,一个进程至少有一个线程2.Thread2.1创建线程2.1.1extendsThread两条线程是并行交替执行线程不一定立即执行packagedemo01;p......
  • 多线程
    1.基础进程和线程并行和并发创建线程的方式线程状态如何保证线程的执行顺序wait和sleep方法的不同如何打断正在运行的线程2.并发安全synchronized底层原理首先它是一个对象锁,重量级锁和锁升级是什么为什么需要轻量级锁因为有些线程是交替执行的,不用竞争3.......
  • java 用CompletableFuture来实现多线程查询和结果合并
    多线程查询结果合并使用CompletableFuture来实现多线程查询和结果合并。CompletableFuture提供了一种方便的方式来协调异步任务并处理其结果。下面是一个使用CompletableFuture的示例:importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CompletableF......
  • c++多线程
    ......
  • C#多线程环境下调用 HttpWebRequest 并发连接限制
    .net的HttpWebRequest或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如windowsxp,windows7下默认是2,在服务器操作系统上默认为10.如果不修改这个并发连接限制,那么客户端同时可以建立的http连接数就只有2个或10个。对于一些诸如浏览器或网络......
  • 多线程总结2(多线程代码案例)
    1.单例模式(Singletonpattern))单例模式保证某个类在进程中只创建一个实例1.1饿汉模式类加载的同时立即创建实例classSingleHungry{//只创建了这一个唯一的实例privatestaticSingleHungryinstance=newSingleHungry();publicstaticSingleHungrygetInstan......
  • 多线程开发 使用Semaphore和BoundedSemaphore对象
    数据库mportthreadingimporttimedeffunc(semaphore:threading.Semaphore,num):#获得信号量,信号量-1semaphore.acquire()print(f"打印信号量:第{num}次")time.sleep(3)#释放信号量,信号量+1semaphore.release()if__name__=='__ma......
  • C++多线程不加锁操作同一个整数
    #include<iostream>#include<thread>#include<vector>#include<chrono>#include<atomic>usingnamespacestd;intnum=0;//volatileintnum=0;//atomic<int>num=0;voidadd(){inttimes=0;for(int......