首页 > 其他分享 >线程

线程

时间:2023-11-09 20:35:03浏览次数:32  
标签:多线程 public 并发 线程 执行 CPU

1. 什么是线程

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

线程是独立调度和分派的基本单位。

2. 线程的特点

(1)轻量实体:线程中实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。

(2)独立调度和分派的基本单位:在多线程操作系统中,线程是能够独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很轻,故线程的切换飞叉昂迅速且开销小。

(3)可并发执行:在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程张红所有线程都能并发执行。

(4)共享进程资源:在同一进程中的各个线程,都可以共享该进程所拥有的资源,所有线程都具有相同的地址空间,线程可以访问改地址空间的每一个虚地址,同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核

3. 什么是多线程

同一时刻只允许执行一个的线程叫单线程;则同一时刻,可以执行多个线程称为多线程。

4. 为什么要使用多线程

(1)      为了更好的利用CPU资源

(2)      进程之间不能共享数据,线程可以

(3)      系统创建进程需要重新分配系统资源,创建线程的代价比较小。

(4)      Java语言内置了多线程功能支持,简化了java多线程编程。

5. 多线程的应用场景

定时任务,监听器,记录日志,数据导入,模拟高并发,统计数据等

6. 线程的生命周期

新建 ->就绪->运行->阻塞->终止

新建:new 一个线程对象(初始化)

就绪:Runable,当调用start()方法,线程即进入就绪状态。这个状态的线程位于可运行池,等待获取CPU使用权。

运行:Runing ,当就绪状态的线程获得了CPU执行资源,执行run()代码则称为运行状态。

阻塞:阻塞状态,指运行中的线程,由于某些原因放弃对CPU的使用权,处于阻塞状态,直到其进入就绪状态,才有机会再次被CPU调用进入运行状态。

等待阻塞(wait()),同步阻塞(获取同步锁失败),其他阻塞(sleep(),join(),或者I/O请求)

终止:正常结束,线程执行完成(interrupt()会抛出异常,break跳出循环,stop()会死锁,线程不安全)

7. 线程的实现方式

(1)    继承Thread类

//线程的调用
public class ThreadTest extends Thread{
    public static void main(String[] args) {
        ThreadTest t=new ThreadTest();
        ThreadTest t1=new ThreadTest();
        t.start();
        t1.start();
        for(int i=0;i<3;i++){
            System.out.println("look这里:"+i+"个");
        }
    }
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println("=====我是线程=="+Thread.currentThread().getName()+" ,i="+i);
        }
    }
}
执行结果

 

(2)    实现Runable接口

(3)  public class RunnableTest implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("线程来了"+Thread.currentThread().getName()+"===,i="+i);
        }
    }
/*
   
定义MyRunnable类实现Runnable接口
    实现run()方法,编写线程执行体
    创建线程对象,调用start()方法启动线程
 */
   
public static void main(String[] args) {
        RunnableTest t=new RunnableTest();
        new Thread(t,"线程1").start();
        new Thread(t,"线程2").start();
    }
}

执行结果

 

(4)    实现Callable接口

(5)  import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CallableTest implements Callable<Boolean> {

    /*
   
实现Callable接口,需要返回值类型
    重写Call方法,需要抛出异常
    创建目标对象
    创建执行服务:ExecutorService es = Executors.newFixedThreadPool(1);
    提交执行:Future r1 = es.submit(d1);
    获取结果:Boolean res1 = r1.get();
    关闭服务:es.shutdownNow();
     */
   
public static void main(String[] args) {
        CallableTest t = new CallableTest();
        ExecutorService es = Executors.newFixedThreadPool(4);
        ExecutorService es2 = Executors.newFixedThreadPool(4);
        es.submit(t);
        es2.submit(t);
    }

    @Override
    public Boolean call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println("Callable线程来了" + Thread.currentThread().getName() + "===,i=" + i);
        }
        return null;
    }
}

执行结果

 

8. 多线程的优点

前面有提到为什么要使用多线程,这也是多线程的亮点及优点

总结:

1).提高CPU的使用率。

2).提高响应性,响应速度快。在使用多线程的情况下,一个请求因为网络延迟得不到满足时,不影响其他 请求。

3).充分利用多核处理器资源,节约资源。

4).最小化对系统资源的利用,一个进程中的多个线程可以共享所在的进程资源。

9. 多线程的缺点

(1)      线程安全问题,当多个线程共享数据时,如果没有采取相应的并发访问措施,那么就可以能产生数据一致性问题。

(2)      线程活性问题,线程死锁,活锁,线程饥饿问题

(3)      上下文问题,上下文切换,增加系统消耗,CPU开销大

(4)      可靠性。

10.    并行与并发

(1)     并行

多个CPU同一段时间内处理两个或两个以上的事件,多个CPU被多个线程同时执行。

(2)     并发

一个CPU同一个时间段内处理两个以上的事件,一个CPU被多个线程来回切换执行。

11.    多线程并发会引发的问题

①    竞争死锁

②    系统资源不足

③    线程泄露

④    并发错误

⑤    任务过载

 

标签:多线程,public,并发,线程,执行,CPU
From: https://www.cnblogs.com/yutting/p/17822736.html

相关文章

  • 实验:C SOCKET 多线程服务端链表分组实现聊天室
    目录......
  • Scala中编写多线程爬虫程序并做可视化处理
    在Scala中编写一个爬虫程序来爬取店铺商品并进行可视化处理,需要使用Selenium和Jsoup库来操作网页。在这个例子中,我们将使用多线程来提高爬取速度。1、首先,我们需要引入所需的库:importorg.openqa.selenium.Byimportorg.openqa.selenium.WebDriverimportorg.openqa.selenium.Web......
  • Python进行多线程爬取数据通用模板
    首先,我们需要导入所需的库,包括requests和BeautifulSoup。requests库用于发送HTTP请求,BeautifulSoup库用于解析HTML文档。importrequestsfrombs4importBeautifulSoup然后,我们需要定义一个函数来发送HTTP请求并返回响应。在这个函数中,我们使用requests库的get方法来发送一个GET......
  • js怎么实现对某个网址进行多线程get访问,实现压力测试效果
    在JavaScript中,实际上没有传统意义上的"多线程",但是我们可以使用WebWorkers来模拟多线程行为。WebWorkers允许您运行JavaScript操作在后台线程,不会影响主线程的性能。然而,WebWorkers更多用于在浏览器端执行耗时的计算任务,并不适用于执行HTTP请求。 对于Node.js环境,我们可以......
  • Python多线程爬取数据代码模版
    由于对爬虫Ip信息的理解可能存在偏差,我将假设你想要爬取的网站支持Python多线程运行数据。以下是一个简单的Haskell爬虫程序,用于爬取Python多线程跑数据的内容:importNetwork.HTTPimportNetwork.URIimportData.ListimportData.MaybeimportControl.Monad--爬虫爬虫Ip信息......
  • 线程安全集合(JDK1.5之前和之后)、CopyOnWriteArrayList、CopyOnWriteArraySet
    JDK1.5之前JDK1.5之前:Collections.synchronizedList JDK1.5之后CopyOnWriteArrayList   CopyOnWriteArraySet    ......
  • 进程与线程
    一、进程​ 我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着CPU会执行程序中的每一条指令,那么这个运行中的程序,就被称为「进程」(Process)。​ 当进程要从硬盘读取数据时,CPU不需要阻塞等待数......
  • Java线程池
      ......
  • java线程:互斥锁与读写锁
    两种互斥锁机制:1、synchronized2、ReentrantLockReentrantLock是jdk5的新特性,采用ReentrantLock可以完全替代替换synchronized传统的锁机制,而且采用ReentrantLock的方式更加面向对象,也更加灵活,网上有很多关于对比两者锁方式的文章,这里就不多口舌了,大家baidu、google一下就水落石......
  • C#多线程与UI响应
    一、概述在使用C#进行应用程序设计时,经常会采用多线程的方式进行一些后台任务的工作。对于不同的应用场景,使用的策略也不尽相同。1.  后台循环任务,少量UI更新:例如批量上传文件,并提供进度。这种情况使用BackgroundWorker组件是非常好的选择。2.  耗时的后......