精华内容
下载资源
问答
  • 什么是进程?在计算中,进程是正在执行的计算机程序的一个实例。或者简单地说,运行程序也称为进程。进程意味着“在单个计算机系统中具有两个或更个CPU。例如,如果计算机系统具有双核心,并且同时运行(执行)...

    什么是多进程?

    在计算中,进程是正在执行的计算机程序的一个实例。或者简单地说,运行程序也称为进程。

    多进程意味着“在单个计算机系统中具有两个或更多个CPU。

    例如,如果计算机系统具有双核心,并且同时运行(执行)两个进程(同时),则可以通过将每个进程分配给系统的每个核心来实现。因此,这两个过程可以同时执行。换句话说,多进程可以定义为多个进程可以同时执行,而不是一个接一个地执行。在多进程中,每个进程都有不同的地址空间和资源。

    什么是多线程?

    进程是线程的集合。线程是一个轻量级的过程。线程执行是执行的小处理单元。

    每个进程包含许多线程,所有线程共享相同的内存空间。

    同一个进程中可以存在多个线程,共享内存等资源,而不同的进程不共享这些资源。

    在单个处理器上,多线程通常通过时分多路复用(如多任务处理):处理器在不同的线程之间切换。

    这种上下文切换通常发生得足够频繁,以至于用户感觉到线程或任务同时运行。

    线程与进程有什么不同?

    线程不同于传统的多任务操作系统进程:

    进程通常是独立的,而线程作为进程的子集存在

    进程比线程携带更多的状态信息,而进程内的多个线程共享进程状态以及内存和其他资源

    进程具有独立的地址空间,而线程共享其地址空间

    进程只能通过系统提供的进程间通信机制进行交互

    同一进程中的线程之间的上下文切换通常比进程之间的上下文切换更快

    多线程调度

    操作系统通过以下两种方式之一来调度线程:

    先发制人的多线程一般被认为是优越的方法,因为它允许操作系统确定何时发生上下文切换。抢占式多线程的缺点是系统可能会在不恰当的时间进行上下文切换,引起锁车队,优先级反转或其他负面影响,这可能会通过协作式多线程来避免。

    另一方面,合作多线程依赖于线程自己放弃控制,一旦他们在停止点。如果线程正在等待资源变为可用状态,则会产生问题。

    线程的保护机制

    一个线程将共享父进程的所有全局变量和文件描述符,允许程序员在一个进程内轻松地分离多个任务。

    它共享一切,除了每个线程将有自己的程序计数器,堆栈和寄存器。由于每个线程都有自己的堆栈,所以线程之间不会共享局部变量。

    由于一个进程的所有线程共享相同的全局变量,所以同步访问全局变量会出现问题。例如,我们假设你有一个全局变量X和两个线程A和B.假设线程A和B只会增加X的值。当线程A开始执行时,它将把X的值复制到寄存器中并递增。在它有机会将值写回内存之前,此线程被暂停。下一个线程开始,读取第一个线程读取的相同的X值,递增并写回到内存。然后,第一个线程完成执行并将其值从寄存器写回到内存。在这两个线程完成之后,X的值会按照您的预期递增1而不是2。

    展开全文
  • 一、多进程多线程区别 多进程和多线程的区别,到底啥是多进程,啥是线程 在一个进程中,有多个任务,线程,分别处理不同的任务,就叫多线程。 在一个系统上,运行着多个进程,多个应用程序,分别处理不同的任务,就...

    一、多进程多线程区别
    多进程和多线程的区别,到底啥是多进程,啥是线程

    在一个进程中也就是一个应用程序,有多个任务,线程,分别处理不同的任务,比如:这边处理ui,显示菜单图形界面,那边处理算法,计算结果,那边采集外部传感器数据,就叫多线程。

    在一个系统上,运行着多个进程,多个应用程序,分别处理不同的任务,就叫多进程。
    啥是多个应用程序?就好比你的手机,电脑,运行着听歌软件,又聊着qq,又聊着微信,又看着电影,分别是不同的app,
    其实就是不同的应用程序,对于一个Windows,安卓系统来说,宏观上是同时并行,微观上还是串行运行的多个任务。

    这很明白了吧,理论上,也可以多个线程处理听歌,qq,微信,电影。但是,但是,为啥要用多进程呢,业务需求不同而已,
    假如你是做听歌软件的,开发商只要愿意,也可以边看电影,边听歌,边聊qq,好比某些直播软件,可以看直播,可以同时发字母,不就是聊天的功能吗。

    到底,是用多线程,还是多进程?就得研究,多线程和多进程的区别,优缺点。

    多线程是在一个应用程序里,意味着多线程可以共享所有全局资源(硬件资源,内存啊,硬盘啊,输入输出啊,数据啊,)。
    注意是全局资源,多线程各自有私有栈,数据,不能共享,多线程,共用一个全局资源,所以可以开销小,线程切换容易,通信简单
    ,可以通过全局区的数据进行通信(全局变量,全局堆,指针,链表,队列啥的),就是竞争的问题,涉及同步与互斥,比如,某个线程想
    输出数据打印到显示屏,就一个串口,不能同时用吧,就需要互斥,谁先用,谁先占用,或比如,我要写数据到队列,另一个要读数据,不可能同时写读吧,写的时候,没写完,读的很快读完了,栈指针发生偏移,写数据的线程,不知道,还是之前的栈指针,结果是会导致数据写错误,被覆盖,栈指针出现错误,这就需要互斥来实现。
    或者线程要同步的情况,同步指的是啥,比如我听歌时,边缓存歌,边播放歌,当我缓存了,我就去播放歌,不可能我没缓存歌,就播放歌吧,一定是先一,后二,这就是同步的概念。可以看出多线程通信是简单的,创建简单,系统管理,切换简单,在大多数开发会采用多线程实现。

    多进程的优缺点,缺点是,一个系统,运行多个程序,每个程序都是占用4g的内存,各自的全局区,不能共享数据,通信比较麻烦,切换时,系统开销大,占用资源,需要保留很多数据,通信的方式,比较常用是网络,共享内存,
    好处是方便管理各自的事,各干各的,互不干涉,一个线程死了,整个进程就崩溃了,但是,其他进程不会死,这如果在一个大系统,只有一个线程死了,影响整个系统,那就完蛋了,好比开飞机,两个发送机,坏了一个,其他还能功能,不会掉下来摔死,如果一个发动机,就等死了,或者手机电脑,听歌软件,卡死了不动,并不影响我看电影啊,你干你的,关我毛事,但是有些系统,会考虑安全的问题,就回分开,采用多进程,以防立马死,我能想到的,还有汽车,现在汽车电子发达,有听歌,看电影,自动驾驶,妈的,突然音乐卡死了,自动驾驶,那得完蛋,但是,汽车的系统,肯定不是多线程,而是多进程,多个系统,多个设备,有专门管理网络的,有专门管理自动算法处理的,有专门管理踩油门的,有专门管理娱乐的。

    所以,到底,多线程,多进程,看需要,简单的产品,多线程容易开发,复杂的系统,多进程,容易开发。比如开发听歌软件,需要搞个多进程来,一边缓存音乐,一遍播放歌词,一遍显示ui画面吗???完全不需要,通信数据交互,复杂死了,还可能卡呢,用一个多线程就可以简单做到,交互数据,开发贼简单。

    最终,总结,多线程,就是一个进程,被进程包含,一个进程可以有多个线程,可以只有一个,比如就一个main函数到底,等我按完按键切换歌曲,你还在干活听歌,还没听到我说话,垃圾,卡死了,摔了。
    一个系统可以运行多个进程。

    展开全文
  • 进阶Java多线程

    2021-04-17 09:36:20
    一、多线程创建方式1.1、继承Thread类创建线程类1.实现步骤定义一个继承Thread类的子类,并重写该类的run()方法;创建Thread子类的实例,即创建了线程对象;调用该线程对象的start()方法启动线程。2.核心代码class ...

    一、多线程创建方式

    1.1、继承Thread类创建线程类

    1.实现步骤

    定义一个继承Thread类的子类,并重写该类的run()方法;

    创建Thread子类的实例,即创建了线程对象;

    调用该线程对象的start()方法启动线程。

    2.核心代码

    class SomeThead extends Thraad {

    public void run() {

    //do something here

    }

    }

    public static void main(String[] args){

    SomeThread oneThread = new SomeThread();

    //启动线程

    oneThread.start();

    }

    1.2、实现Runnable接口创建线程类

    1.实现步骤

    定义Runnable接口的实现类,并重写该接口的run()方法;

    创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象。

    2.核心代码

    class SomeRunnable implements Runnable {

    public void run() {

    //do something here

    }

    }

    Runnable oneRunnable = new SomeRunnable();

    Thread oneThread = new Thread(oneRunnable);

    oneThread.start();

    1.3、通过Callable和Future创建线程

    1.实现步骤

    创建Callable接口的实现类,并实现call()方法,改方法将作为线程执行体,且具有返回值。

    创建Callable实现类的实例,使用FutrueTask类进行包装Callable对象,FutureTask对象封装了Callable对象的call()方法的返回值

    使用FutureTask对象作为Thread对象的target创建并启动新线程

    调用FutureTask对象的get()方法获取子线程执行结束后的返回值。

    2.核心代码

    //1.创建Callable接口的实现类,并实现call()方法

    public class SomeCallable01 implements Callable {

    @Override

    public Integer call() throws Exception {

    int i = 0;

    for(;i<10;i++)

    {

    System.out.println(Thread.currentThread().getName()+" "+i);

    }

    return i;

    }

    public static void main(String[] args) {

    //2.创建Callable实现类的实例

    SomeCallable01 ctt = new SomeCallable01();

    //3.使用FutrueTask类进行包装Callable对象,FutureTask对象封装了Callable对象的call()方法的返回值

    FutureTask ft = new FutureTask<>(ctt);

    //开启ft线程

    for(int i = 0;i < 21;i++)

    {

    System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);

    if(i==20)//i为20的时候创建ft线程

    {

    //4.使用FutureTask对象作为Thread对象的target创建并启动新线程

    new Thread(ft,"有返回值的线程FutureTask").start();

    }

    }

    //ft线程结束时,获取返回值

    try

    {

    //5.调用FutureTask对象的get()方法获取子线程执行结束后的返回值。

    System.out.println("子线程的返回值:"+ft.get());//get()方法会阻塞,直到子线程执行结束才返回

    } catch (InterruptedException e)

    {

    e.printStackTrace();

    } catch (ExecutionException e)

    {

    e.printStackTrace();

    }

    }

    }

    二、创建线程方式的区别

    1.使用继承Thread类的方式创建多线程

    1)优势

    编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

    2)劣势

    线程类已经继承了Thread类,所以不能再继承其他父类。(有单继承的局限性)

    创建多线程时,每个任务有成员变量时不共享,必须加static才能做到共享

    2.使用实现Runnable类的方式创建多线程

    1)优势

    避免了单继承的局限性、多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。

    2)劣势

    比较复杂、访问线程必须使用Thread.currentThread()方法、无返回值。

    3.使用实现Callable接口的方式创建多线程

    1)优势

    有返回值、避免了单继承的局限性、多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。

    2)劣势

    比较复杂、访问线程必须使用Thread.currentThread()方法

    4.Runnable和Callable的区别

    1)Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。

    2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

    3)call方法可以抛出异常,run方法不可以。

    4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的

    完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果future.get()。

    三、多线程调度

    3.1、调度策略

    时间片:线程的调度采用时间片轮转的方式

    抢占式:高优先级的线程抢占CPU

    3.2、Java的调度方法

    1)对于同优先级的线程组成先进先出队列(先到先服务),使用时间片策略

    2)对高优先级,使用优先调度的抢占式策略

    3.3、线程的优先级

    等级:

    MAX_PRIORITY:10

    MIN_PRIORITY:1

    NORM_PRIORITY:5

    方法:

    getPriority():返回线程优先级

    setPriority(int newPriority):改变线程的优先级

    备注:

    高优先级的线程要抢占低优先级的线程的cpu的执行权。但是仅是从概率上来说的,高优先级的线程更有可能被执行。并不意味着只有高优先级的线程执行完以后,低优先级的线程才执行。

    四、多线程状态管理

    4.1、线程睡眠---sleep

    1)概述

    如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法。

    2)线程睡眠方法

    在指定的毫秒数内让正在执行的线程休眠:

    sleep(long millis)

    在指定的毫秒数加指定的纳秒数内让正在执行的线程休眠:

    sleep(long millis,int nanos)

    3)代码实现

    sleep是静态方法,最好不要用Thread的实例对象调用它,因为它睡眠的始终是当前正在运行的线程,而不是调用它的线程对象,它只对正在运行状态的线程对象有效。

    public class SynTest {

    public static void main(String[] args) {

    new Thread(new CountDown(),"倒计时").start();

    }

    }

    class CountDown implements Runnable{

    int time = 10;

    public void run() {

    while (true) {

    if(time>=0){

    System.out.println(Thread.currentThread().getName() + ":" + time--);

    try {

    Thread.sleep(1000); //睡眠时间为1秒

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    }

    4)备注

    Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。但是不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。因为使用sleep方法之后,线程是进入阻塞状态的,只有当睡眠的时间结束,才会重新进入到就绪状态,而就绪状态进入到运行状态,是由系统控制的,我们不可能精准的去干涉它,所以如果调用Thread.sleep(1000)使得线程睡眠1秒,可能结果会大于1秒。

    4.2、线程让步---yield

    1)概述

    yield()方法和sleep()方法有点相似,它也是Thread类提供的一个静态的方法,它也可以让当前正在执行的线程暂停,让出cpu资源给其他的线程。但是和sleep()方法不同的是,它不会进入到阻塞状态,而是进入到就绪状态。yield()方法只是让当前线程暂停一下,重新进入就绪的线程池中,让系统的线程调度器重新调度器重新调度一次,完全可能出现这样的情况:当某个线程调用yield()方法之后,线程调度器又将其调度出来重新进入到运行状态执行。

    实际上,当某个线程调用了yield()方法暂停之后,优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程更有可能获得执行的机会,当然,只是有可能,因为我们不可能精确的干涉cpu调度线程。

    2)代码实现

    public class Test1 {

    public static void main(String[] args) throws InterruptedException {

    new MyThread("低级", 1).start();

    new MyThread("中级", 5).start();

    new MyThread("高级", 10).start();

    }

    }

    class MyThread extends Thread {

    public MyThread(String name, int pro) {

    super(name);// 设置线程的名称

    this.setPriority(pro);// 设置优先级

    }

    @Override

    public void run() {

    for (int i = 0; i < 30; i++) {

    System.out.println(this.getName() + "线程第" + i + "次执行!");

    if (i % 5 == 0)

    Thread.yield();

    }

    }

    }

    3)sleep和yield的区别

    ① sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态。而yield方法调用后 ,是直接进入就绪状态,所以有可能刚进入就绪状态,又被调度到运行状态。

    ② sleep方法声明抛出了InterruptedException,所以调用sleep方法的时候要捕获该异常,或者显示声明抛出该异常。而yield方法则没有声明抛出任务异常。

    ③ sleep方法比yield方法有更好的可移植性,通常不要依靠yield方法来控制并发线程的执行。

    4.3、线程合并---join

    1)概述

    线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时,Thread类提供了join方法来完成这个功能,注意,它不是静态方法。

    简而言之:

    ​当B线程执行到了A线程的.join()方法时,B线程就会等待,等A线程都执行完毕,B线程才会执行。join可以用来临时加入线程执行。

    2)线程合并方法

    它有三个重载方法:

    ​当前线程等该加入该线程后面,等待该线程终止。

    void join()

    ​当前线程等待该线程终止的时间最长为 millis 毫秒。

    ​如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

    void join(long millis)

    ​等待该线程终止的时间最长为 millis 毫秒 + nanos

    ​纳秒。如果在millis时间内,该线程没有执行完,那么当前线程进入就绪状态,重新等待cpu调度

    void join(long millis,int nanos)

    3)代码实现

    public static void main(String[] args) throws InterruptedException {

    yieldDemo ms = new yieldDemo();

    Thread t1 = new Thread(ms,"张三吃完还剩");

    Thread t2 = new Thread(ms,"李四吃完还剩");

    Thread t3 = new Thread(ms,"王五吃完还剩");

    t1.start();

    t1.join();

    t2.start();

    t3.start();

    System.out.println( "主线程");

    }

    Thread t = new Thread(() -> {

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    r = 10;

    });

    t.start();

    // 让主线程阻塞 等待t线程执行完才继续执行

    // 去除该行,执行结果为0,加上该行 执行结果为10

    t.join();

    log.info("r:{}", r);

    // 运行结果

    13:09:13.892 [main] INFO thread.TestJoin - r:10

    4.4、设置线程的优先级

    1)概述

    每个线程执行时都有一个优先级的属性,优先级高的线程可以获得较多的执行机会,而优先级低的线程则获得较少的执行机会。与线程休眠类似,线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的也并非没机会执行。

    每个线程默认的优先级都与创建它的父线程具有相同的优先级,在默认情况下,main线程具有普通优先级。

    2)涉及优先级方法

    Thread类提供了setPriority(int newPriority)和getPriority()方法来设置和返回一个指定线程的优先级,其中setPriority方法的参数是一个整数,范围是1~·0之间,也可以使用Thread类提供的三个静态常量:

    MAX_PRIORITY =10

    MIN_PRIORITY =1

    NORM_PRIORITY =5

    3)代码实现

    public class Test1 {

    public static void main(String[] args) throws InterruptedException {

    new MyThread("高级", 10).start();

    new MyThread("低级", 1).start();

    }

    }

    class MyThread extends Thread {

    public MyThread(String name,int pro) {

    super(name);//设置线程的名称

    setPriority(pro);//设置线程的优先级

    }

    @Override

    public void run() {

    for (int i = 0; i < 100; i++) {

    System.out.println(this.getName() + "线程第" + i + "次执行!");

    }

    }

    }

    4)备注

    虽然Java提供了10个优先级别,但这些优先级别需要操作系统的支持。不同的操作系统的优先级并不相同,而且也不能很好的和Java的10个优先级别对应。所以我们应该使用MAX_PRIORITY、MIN_PRIORITY和NORM_PRIORITY三个静态常量来设定优先级,这样才能保证程序最好的可移植性。

    4.5、后台(守护)线程

    1)概述

    守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。

    默认情况下,java进程需要等待所有线程都运行结束,才会结束,有一种特殊线程叫守护线程,当所有的非守护线程都结束后,即使它没有执行完,也会强制结束。

    2)涉及方法

    调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。

    将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

    该方法必须在启动线程前调用。 该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。

    public final void setDaemon(boolean on)

    参数:

    on - 如果为 true,则将该线程标记为守护线程。

    抛出:

    IllegalThreadStateException - 如果该线程处于活动状态。

    SecurityException - 如果当前线程无法修改该线程。

    3)守护线程的用途

    守护线程通常用于执行一些后台作业,例如在你的应用程序运行时播放背景音乐,在文字编辑器里做自动语法检查、自动保存等功能。

    java的垃圾回收也是一个守护线程。守护线的好处就是你不需要关心它的结束问题。例如你在你的应用程序运行的时候希望播放背景音乐,如果将这个播放背景音乐的线程设定为非守护线程,那么在用户请求退出的时候,不仅要退出主线程,还要通知播放背景音乐的线程退出;如果设定为守护线程则不需要了。

    4.6、停止线程

    1)概述

    Thread.stop()、Thread.suspend、Thread.resume、Runtime.runFinalizersOnExit这些终止线程运行的方法已经被废弃了,使用它们是极端不安全的。

    正确停止线程的方法:

    ​第一:正常执行完run方法,然后结束掉。

    ​第二:控制循环条件和判断条件的标识符来结束掉线程。

    2)实现代码示例

    class MyThread extends Thread {

    int i=0;

    boolean next=true;

    @Override

    public void run() {

    while (next) {

    if(i==10)

    next=false;

    i++;

    System.out.println(i);

    }

    }

    }

    4.7、线程打断---interrupt

    1)什么是中断(interrupt)

    ​中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现;

    ​每个线程对象中都有一个标识,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断;

    ​通过调用线程对象的interrupt方法将该线程的标识位设为true;可以在别的线程中调用,也可以在自己的线程中调用。

    打断标记:线程是否被打断,true表示被打断了,false表示没有

    2)涉及方法

    isInterrupted()方法:

    获取线程的打断标记(哪个线程对象调用就检查谁的) ,调用后不会修改线程的打断标记

    interrupt()方法:

    中断this线程(哪个线程对象调用即中断谁)。如果这个需要被中断线程处于阻塞状态(sleep、wait、join),那么它的中断状态就会被清除,并且抛出异常(InterruptedException)。这个中断并非真正的停止掉线程,而是将它的中断状态设置成“停止”的状态,线程还是会继续运行,至于怎么停止掉该线程,还是要靠我们自己去停止,该方法只是将线程的状态设置成“停止”的状态,即true。

    打断正常线程 ,线程不会真正被中断,但是线程的打断标记为true。

    interrupted()方法:

    检查当前线程是否被中断,与上面的interrupt()方法配合一起用。线程的中断状态将会被这个方法清除,也就是说:如果这个方法被连续成功调用两次,第二次

    调用将会返回false(除非当前线程在第一次调用之后和第二次调用之前又被中断了)。

    也就是说:调用后清空打断标记 即如果获取为true 调用后打断标记为false (不常用)

    4.8、线程堵塞

    线程的阻塞可以分为好多种,从操作系统层面和java层面阻塞的定义可能不同,但是广义上使得线程阻塞的方式有下面几种:

    1)BIO阻塞,即使用了阻塞式的io流

    2)sleep(long time) 让线程休眠进入阻塞状态

    3)a.join() 调用该方法的线程进入阻塞,等待a线程执行完恢复运行

    4)sychronized或ReentrantLock 造成线程未获得锁进入阻塞状态

    5)获得锁之后调用wait()方法 也会让线程进入阻塞状态

    6)LockSupport.park() 让线程进入阻塞状态

    五、线程核心方法总结

    5.1、六种线程状态和方法的对应关系

    073727919663605008afb054e5a1139e.png

    5.2、线程核心方法总结

    1)Thread类中的核心方法

    方法名称

    是否static

    方法说明

    start()

    让线程启动,进入就绪状态,等待cpu分配时间片

    run()

    重写Runnable接口的方法,线程获取到cpu时间片时执行的具体逻辑

    yield()

    线程的礼让,使得获取到cpu时间片的线程进入就绪状态,重新争抢时间片

    sleep(time)

    线程休眠固定时间,进入阻塞状态,休眠时间完成后重新争抢时间片,休眠可被打断

    join()/join(time)

    调用线程对象的join方法,调用者线程进入阻塞,等待线程对象执行完或者到达指定时间才恢复,重新争抢时间片

    isInterrupted()

    获取线程的打断标记,true:被打断,false:没有被打断。调用后不会修改打断标记

    interrupt()

    打断线程,抛出InterruptedException异常的方法均可被打断,但是打断后不会修改打断标记,正常执行的线程被打断后会修改打断标记

    interrupted()

    获取线程的打断标记。调用后会清空打断标记

    stop()

    停止线程运行 不推荐

    suspend()

    挂起线程 不推荐

    resume()

    恢复线程运行 不推荐

    currentThread()

    获取当前线程

    2)Object中与线程相关方法

    方法名称

    方法说明

    wait()/wait(long timeout)

    获取到锁的线程进入阻塞状态

    notify()

    随机唤醒被wait()的一个线程

    notifyAll()

    唤醒被wait()的所有线程,重新争抢时间片

    展开全文
  • mysql多线程

    2021-01-19 01:21:36
    安装iotop,yum install iotop2.iotop查看mysql进程里的各运行线程:iotop -u mysql ##-u mysql查询用户mysql运行的对应程序这边可以看到,虽然mysql是单进程实例,但是在运行过程中会产生很多线程。在某些卡顿的情况...

    通过iotop与performance_schema.threads查看mysql的IO使用情况

    1.安装iotop,yum install iotop2.iotop查看mysql进程里的各运行线程:iotop -u mysql ##-u mysql查询用户mysql运行的对应程序这边可以看到,虽然mysql是单进程实例,但是在运行过程中会产生很多线程。在某些卡顿的情况下,可以使用该命令查看哪...

    文章

    the_script

    2019-02-12

    1584浏览量

    MySQL内核月报 2014.12-MySQL· 性能优化·thread pool 原理分析

    大连接问题

    现有mysql 处理客户端连接的方式会触发mysql 新建一个线程来处理新的连接,新建的线程会处理该连接所发送的所有 SQL 请求,即 one-thread-per-connection 的方式,其创建连接的堆栈为:

    线程建立后,处理请求的堆栈如下:

    0 mysql_execute...

    文章

    db匠

    2016-05-23

    2376浏览量

    MySQL主从延时这么长,要怎么优化?

    MySQL主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重。

    为什么主从延时这么大?

    答:MySQL使用单线程重放RelayLog。

    应该怎么优化,缩短重放时间?

    答:多线程并行重放RelayLog可以缩短时间。

    多线程并行...

    文章

    初商

    2019-08-08

    675浏览量

    与慢速设备通讯异步化方案

    与慢速设备通讯异步化方案.pdf像MySQL、被对接的银行系统等,都可称作慢速设备。它们的共同特点是只提供了同步调用接口,而且响应通常会比较慢。

    一般业务系统在业务线程或进程中,直接调用它们提供的API进行访问,如下图所示:

    结果造成了以下两大问题:

    ...

    文章

    一见蓝天

    2014-06-24

    476浏览量

    MySQL主从延时这么长,要怎么优化?

    MySQL主从复制,读写分离是互联网常见的数据库架构,该架构最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重。

    为什么主从延时这么大?

    答:MySQL使用单线程重放RelayLog。

    应该怎么优化,缩短重放时间?

    答:多线程并行重放RelayLog可以缩短时间。

    多线...

    文章

    技术小能手

    2018-10-15

    2521浏览量

    学习mysql数据库主从同步复制原理

    MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能、更高可靠性要求的场合。与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少。

    MySQL的R...

    文章

    烂泥行天下

    2016-05-12

    4120浏览量

    Mysql线程池系列二(Oracle Mysql Thread pool的安装和原理)

    Mysql线程池系列二(Oracle Mysql Thread pool的安装和原理)

    Mysql线程池系列一(Thread pool FAQ)

    Mysql线程池系列二(Oracle Mysql Thread pool的安装和原理)Mysql线程池系列三(Oracle Mysql Thread ...

    文章

    技术小胖子

    2017-11-07

    1266浏览量

    MySQL 5.7: Page Cleaner的刷脏问题

    之前我已经写过一篇博客,讨论过在flush LRU_LIST/FLUSH_LIST时,5.7对其做的优化,总的来说,就是使用类似Hazard Pointer的方式,避免在flush的过程中重复扫描LIST,将时间复杂度从O(N*N)下降到了O(N)。有兴趣的同学可以翻阅下这篇博客:http://m...

    文章

    zhaiwx_yinfeng

    2016-05-10

    2134浏览量

    Mysql5.6的1755错误解决办法

    遇到的问题:

    最近遇到一个Mysql5.6的主备复制问题,这个错误编号为1755:

    1

    Cannot execute the current event group in the parallel mode

    2

    ......此处省略......

    3

    Reason: t...

    文章

    x64.ink

    2016-05-27

    1970浏览量

    MySQL锁的用法之表级锁

    锁机制是数据库有别于文件系统的一个重要的特点,也是用来管理并发访问的一个有效的方式。MySQL的锁分为表级锁、页级锁与行级锁。表级锁是MySQL中粒度最大的一种锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。

    表级锁定分为两类,读锁...

    文章

    玄学酱

    2017-07-10

    2730浏览量

    mysql 主从复制的 工作原理

    mysql 主从复制原理

    主从形式

    mysql主从复制 灵活

    一主一从

    主主复制

    一主多从---扩展系统读取的性能,因为读是在从库读取的;

    多主一从---5.7开始支持

    联级复制---

    用途及条件

    mysql主从复制用途

    实时灾备,用于故障切换

    读写分离,提供查询服务...

    文章

    李世龙ing

    1970-01-01

    1885浏览量

    mysql 主从复制的 工作原理

    mysql 主从复制原理

    主从形式

    mysql主从复制 灵活

    一主一从

    主主复制

    一主多从---扩展系统读取的性能,因为读是在从库读取的;

    多主一从---5.7开始支持

    联级复制---

    用途及条件

    mysql主从复制用途

    实时灾备,用于故障切换

    读写分离,提供查询服务...

    文章

    吴梦涵

    1970-01-01

    1028浏览量

    [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7

    原文:[MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7

    一、缘由:

    某天看到主从复制延时的告警有点频繁,就想着是不是彻底可以解决一下。

    一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) ----->IO Thread (从) -----&g...

    文章

    杰克.陈

    2017-09-08

    1022浏览量

    MySQL 锁机制

    Innodb的为行锁 MyISAM的为表锁

    lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read;另外一种是写锁定,用命令lock tables tablename write.下边分别介绍:

    1. lo...

    文章

    科技小能手

    2017-11-12

    732浏览量

    MySQL大事务导致的Insert慢的案例分析

    原文:MySQL大事务导致的Insert慢的案例分析

    【问题】

    有台MySQL服务器不定时的会出现并发线程的告警,从记录信息来看,有大量insert的慢查询,执行几十秒,等待flushing log,状态query end

    【初步分析】

    从等待资源来看,大部分时间消耗在了innodb_log_f...

    文章

    杰克.陈

    2018-10-21

    1145浏览量

    MySQL 性能优化

    网站访问量越来越大,MySQL

    自然成为瓶颈,因此最近我一直在研究MySQL的优化,第一步自然想到的是MySQL系统

    参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库

    系统,不可能指望MySQL默认的系统参数能够让MySQL运行得非常顺畅。

    通过在网络上查找资料和自己的尝试,我认为...

    文章

    honeymoose

    2010-03-28

    549浏览量

    mysql并行复制降低主从同步延时的思路与启示

    一、缘起

    mysql主从复制,读写分离是互联网用的非常多的mysql架构,主从复制最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严重。

    为什么mysql主从延时这么大?

    回答:从库使用【单线程】重放relaylog。

    优化思路是什么?

    回答:使用单线程重放relaylog使得...

    文章

    初商

    2019-08-11

    412浏览量

    MySQL数据库性能优化妙招

    通过在网络上查找资料和自己的尝试,我认为以下系统参数是比较关键的:

    (1)、back_log:

    要求 MySQL

    能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。

    back_log

    值指...

    文章

    lzhdim

    2009-03-25

    565浏览量

    浅谈MySQL原理与优化(二)—— 处理引擎

    引言

    在上一篇中,我们探讨了MySQL的体系结构的组成部分。主要由客户端、处理引擎、存储引擎组成

    现在,我们来详细的分析一下处理引擎的作用。处理引擎相当于MySQL的大脑。他有三个非常重要的作用。

    管理连接与线程

    mysql是采用的多线程模型,使用线程池来管理数据库的连接。线程对象被放在一个线程池...

    文章

    hehehao

    2020-04-15

    391浏览量

    浅谈MySQL原理与优化(二)—— 处理引擎

    引言

    在上一篇中,我们探讨了MySQL的体系结构的组成部分。主要由客户端、处理引擎、存储引擎组成

    现在,我们来详细的分析一下处理引擎的作用。处理引擎相当于MySQL的大脑。他有三个非常重要的作用。

    管理连接与线程

    mysql是采用的多线程模型,使用线程池来管理数据库的连接。线程对象被放在一个线程池...

    文章

    hehehao

    2020-04-24

    185浏览量

    Mysql锁初步

    存储引擎

    要了解mysql的锁,就要先从存储引擎说起。

    常用存储引擎列表如下图所示:

    最常使用的两种存储引擎:

    Myisam是Mysql的默认存储引擎。当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名...

    文章

    槟城码农

    2016-11-08

    719浏览量

    MariaDB和MySQL性能测试比较

    现在选择继续使用MySQL或抛弃它切换到MariaDB有足够的理由。

    现在把目光移到benchmark上面来,它其实也是由MariaDB团队开发的,并加了一下额外的说明。这篇博客提到了一个有趣的地方:把MYSQL5.6的线程数一直增加到16,性能都很好,但是超过了16的话,尽管性能也有提升一...

    文章

    晚来风急

    2017-07-03

    2996浏览量

    mysql 主从复制存在问题及解决方法

    主从形式

    mysql主从复制 灵活

    一主一从

    主主复制

    一主多从---扩展系统读取的性能,因为读是在从库读取的;

    多主一从---5.7开始支持

    联级复制---

    用途及条件

    mysql主从复制用途

    实时灾备,用于故障切换

    读写分离,提供查询服务

    ...

    文章

    技术小甜

    2017-11-15

    1577浏览量

    两个数据库的问题(r11笔记第4天)

    下午一个偶然的机会听到了一首歌,让我一下子想起了在泰国出差的日子。这首歌曲让我我电脑前工作很长时间,在深夜,因为东南亚时差的原因,我感觉我好像多活了一个小时。有时候醒来是在沙发上,有时候醒来发现灯还没关,生活就是在这种随意而又忙碌的感觉下流逝。

    歌曲(Long Lost Penpal)推荐给...

    文章

    jeanron100

    2016-12-06

    687浏览量

    MySQL并行复制的深入浅出

    一、并行复制的背景

    首先,为什么会有并行复制这个概念呢?

    1. DBA都应该知道,MySQL的复制是基于binlog的。

    2. MySQL复制包括两部分,IO线程 和 SQL线程。

    3. IO线程主要是用于拉取接收Master传递过来的binlog,并将其写入到relay log

    4. SQL线程...

    文章

    兰春

    2018-08-01

    10424浏览量

    理解数据库和实例

    数据库:物理操作系统文件或者其他形式文件类型的集合。在mysql中,数据库文件可以是frm、MYD、MYI、ibd等结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统文件,而是存放于内存之中的文件。

    实例:mysql数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程...

    文章

    liuer0311

    2017-11-08

    937浏览量

    百度二面

    项目相关

    类加载器

    JVM模型

    java NIO

    多线程synchronize(当前线程是否也无法进入其他sync方法)和volatile作用及实现原理

    MySQL隔离级别,索引

    spring事务

    spring aop原理

    mybatis原理

    Linux常用命令

    10亿未知数字找出top5

    面试已...

    文章

    javaedge

    2018-01-16

    939浏览量

    [缺陷分析]半同步下多从库复制异常

    作者:黄炎、王悦、周海鸣

    本文分析的缺陷是MySQL bug#89370,其主要的现象是:配置半同步(复制)到多个从库,部分从库在一段时间内无法复制数据,但所有复制状态均正常。

    缺陷的复现

    MySQL版本:5.7.16,5.7.17,5.7.21

    配置半同步一个master两个slave,设置m...

    文章

    爱可生开源社区

    2019-03-25

    764浏览量

    MySQL从5.6到8.0并行复制的演进

    MySQL从5.6到8.0并行复制的演进

    一、MySQL的主从复制

    1.1 主从复制基本原理

    MySQL的主从架构依赖于MySQL Binlog功能,Master节点上产生Binlog并且写入到文件中。  Master节点上启动一个DUMP线程:当Slave节点I/O线程连接Master时,M...

    文章

    梓杰

    2019-09-04

    839浏览量

    大访问量网站的mysql参数如何设置

    网站访问量越来越大,MySQL自然成为瓶颈。

    因此MySQL 的优化成为我们需要考虑的问题,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL 默认的系统参数能够让 MySQL运行得非常顺畅。

    (...

    文章

    科技小能手

    2017-11-12

    605浏览量

    展开全文
  • 程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。2,线程和进程有什么区别?线程是进程的子集,一个进程...
  • volatile的用途 1.线程可见性 package com.mashibing.testvolatile; public class T01_ThreadVisibility { private static volatile boolean flag = true; public static void main(String[] args) throws ...
  • 我们在上文中给大家简单介绍了java多线程编程中线程与进程的基本概念和线程生命周期等技术知识,而今天我们就再来了解一下,java多线程编程的作用都有哪些。1.充分利用CPU资源现在世界上大多数计算机只有一块CPU。...
  • pthread多线程(C语言) + Socketpthread是使用使用C语言编写的多线程的API, 简称Pthreads ,是线程的POSIX标准,可以在Unix / Linux / Windows 等系统跨平台使用。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都...
  • swoole的多线程其实就是多进程,进程创建太多切换的开销很大,如果能用上pthreads建议用pthreads。swoole实例如下: (推荐学习:swoole视频教程)
  • Java多线程整理(li)

    2021-03-04 00:48:23
    因此对应long或double类型的数据用于多线程共享时,必须申明加上volatile或者进行同步。*/ 三、CountDownLatch用法 在jdk API中如下描述:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多...
  • Java多线程

    2021-07-13 15:52:16
    Java多线程前言进程与线程进程概念线程概念为什么要在代码中引入多线程?并发编程及优缺点并发编程的三要素并发、并行、串行的区别线程与进程的区别上下文切换守护线程和用户线程的区别用户态和内核态创建线程的几种...
  • 看完这篇文章,不用愁面试官问关于多线程的问题了
  • 对于一个大的任务,一般的做法是利用一个进程,串行的执行,如果系统资源足够,可以采用parallel技术,把一个大的任务分成若干个小的任务,同时启用n个进程/线程,并行的处理这些小的任务,这些并发的进程称为并行...
  • Java多线程并发工具类

    2021-02-12 11:08:26
    Semaphore-信号灯机制当我们创建一个可扩展大小的线程池,并且需要在线程池内同时让有限数目的线程并发运行时,就需要用到Semaphore(信号灯机制),Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目...
  • 高并发的时候就是有很用户在访问,导致系统数据不正确、糗事数据的现象。对于一些大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的...
  • python 多线程实现循环打印 abc好久没写过python了, 想自己实践一下把非阻塞版import threadingimport timedef print_a():global valueglobal lockglobal stop_flagwhile stop_flag:while True:if value == 0 or ...
  • 这里写目录标题并发编程基础blocked 和 waiting 的区别线程的 run()和 start()有什么区别?为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?说说线程的生命周期及五种基本状态...
  • 形象的点描述:一个人做很事情,但同一时刻只能做一件事情。--并行:当系统有一个CPU时,则程序的操作有可能非并发。当一个CPU执行一个程序时,另一个CPU可以执行另一个程序,两个程序互不抢占...
  • 多线程与并发编程

    2021-03-16 14:44:33
    多线程与并发编程 并发与并行 **并发:**多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是 同时执行。 **并行:**单位时间内,多个处理器或多核处理器同时处理多个任务,是真正...
  • 异步与多线程的区别一、异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法。异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾自的...
  • HTML5中怎么实现多线程发布时间:2021-06-05 10:59:22来源:亿速云阅读:79作者:Leah这篇文章将为大家详细讲解有关HTML5中怎么实现多线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章...
  • 多线程

    2021-03-08 21:20:12
    多线程 本节重点: 了解线程概念,理解线程与进程区别与联系。 学会线程控制,线程创建,线程终止,线程等待。 了解线程分离与线程安全概念。 学会线程同步。 学会使用互斥量,条件变量,posix信号量,以及读写锁。...
  • 那么,为什么JavaScript不能有线程呢?这样能提高效率啊。JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很...
  • android多线程

    2021-05-27 06:49:58
    线程的基本用法:android多线程编程其实并不比java多线程特殊,基本都是使用相同的语法,比如说,定义一个线程只需要新建一个类继承自Thread,然后重写父类的run()方法,并在里面编写耗时的逻辑即可,public class...
  • 通过适当的体系结构,多线程可以帮助将查询的负载抵消到CPU上,而不是进行慢速磁盘读/写操作.在某些情况下,使用CPU周期计算值更快,而不是创建计算列(之前已保存到磁盘)并从磁盘读取此列.在某些RDBMS中,有一个临时DB...
  • 多线程访问网页+高并发测试网页仅供学习,请勿用于非法用途。线程类如下import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import ...
  • 跨平台多线程编程

    2021-05-23 11:54:00
    多线程介绍定义了多线程编程的标准API。这个API就是广为人知的pthreads。它的目的在于为跨平台编写多线程程序提供便利。多线程程序的编写本文介绍了Linux 和 WIN32 平台下的多线程程序的编写方法Linux 系统对 ...
  • 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。...
  • Java多线程技术

    2021-03-01 06:23:09
    多线程编程一直是学员们比较头痛和心虚的地方,因为线程执行顺序的不可预知性和调试时候的困难,让不少人在面对多线程的情况下选择了逃避,采用单线程的方式,其实只要我们对线程有了明确的认识,再加上java内置的对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,458
精华内容 47,783
关键字:

多线程用途