>  기사  >  Java  >  프로세스와 스레드란 무엇입니까?

프로세스와 스레드란 무엇입니까?

零下一度
零下一度원래의
2017-06-25 10:18:251796검색

1 개요

1. 프로세스란 무엇인가요?

프로세스는 비교적 독립적인 실행 단위입니다.

2. 스레드란 무엇인가요?

프로세스의 일부인 프로세스의 실제 작업 실행자가 프로세스에 연결되어야 합니다. 프로세스에 대한 스레드의 의존성은 주로 다음에 반영됩니다.

  • 스레드는 프로세스 없이 시작할 수 없으며 프로세스가 시작된다는 전제 하에 시작되어야 합니다.

  • 스레드는 때때로 프로세스에서 데이터를 가져와야 합니다.

3. 스레드와 프로세스의 차이점은 무엇인가요?

스레드와 프로세스는 두 가지 상대적인 개념입니다. 개체는 자신이 속한 실행 단위와 관련된 프로세스라고 하며 스레드라고도 합니다.

4. 멀티스레딩의 설계 목적, 목적 및 의미

CUP는 언제든지 하나의 스레드만 실행할 수 있습니다. 멀티스레딩의 핵심은 여러 작업을 고속으로 교대로 실행하는 것입니다. 다중 스레드 간에 데이터 교환이 없는 경우

는 독립적으로 실행될 수 있습니다. 다중 스레드를 사용해도 전체 실행 시간을 줄일 수는 없습니다.

멀티 스레드 설계의 주요 목적은 실행 속도를 높이는 것이 아니라 각 스레드를 상대적으로 균등하게 실행하여 특정 스레드가 오랫동안 CPU 타임 슬라이스를 보유하지 않도록 하고

다른 스레드를 실행하는 것입니다. 오랫동안 기다려야 하는 스레드. CPU 타임 슬라이스는 인간의 감각이 감지할 수 있는 범위를 넘어 여러 스레드 사이를 빠르게 전환하기 때문에 여러 작업이 실행되는 것처럼 느껴집니다.

예를 들어, 여러 사람이 동일한 웹사이트를 방문할 경우, 멀티스레딩을 사용하지 않고 동시에 한 사람만 웹사이트에 입장할 수 있도록 허용하면 한 사람당 5분이 소요됩니다. 5분 정도 기다려야 합니다. 사용자 경험이 매우 좋지 않습니다. 이는 멀티스레딩을 사용합니다. 한 사람이 진입하면 CPU가 다른 사용자에게로 전환되어 다른 사용자가 차례로 진입할 수 있게 되지만 총 실행 시간은 줄어들지 않습니다.

5. CPU 스케줄링 모드

시간 공유 스케줄링 모드: 시스템은 CPU 시간 조각을 각 스레드에 균등하게 할당합니다.

  • 선점형 스케줄링 모드: 각 스레드는 CPU 시간 조각을 놓고 경쟁하며 CPU 시간 조각은 스레드 간에 고르지 않게 분배됩니다.

  • 두 번째 스레드 생성

1. Java SE API는 스레드를 생성하는 두 가지 방법을 제공합니다.

Runnable 인터페이스를 구현하고 구현 클래스의 객체를 매개 변수로 Thread 생성자에 전달합니다. 가운데.

  • Thread 클래스를 직접 상속합니다.

  • 2. 어떤 방법을 사용하든 수행해야 할 작업은 반드시 run 메서드에 배치해야 합니다.

3. 두 가지 생성 방법의 차이점:

⑴Java는 단일 상속을 사용합니다. 즉, 클래스는 하나의 상위 클래스만 상속할 수 있으며 클래스는 여러 인터페이스를 구현하고 Thread를 상속하여 스레드를 생성할 수 있습니다. . 이로 인해

이 클래스는 유일한 상속 기회를 잃게 됩니다.

⑵자원 공유를 달성하는 방법에는 여러 가지가 있습니다

  • 먼저 Thread를 상속하여 스레드를 생성하는 방식으로도 리소스 공유를 달성할 수 있지만 new 키워드를 통해 생성된 다중 스레드는 다릅니다. 객체, 공유 리소스는 일반적으로 생성자 주입을 통해 외부에서만 가져올 수 있습니다.

  • Runnable 인터페이스를 구현하여 스레드를 생성하면 동일한 구현 클래스 개체를 사용하여 여러 스레드를 생성하여 리소스 공유를 실현할 수 있으며 공유 리소스는 스레드 내에서 나옵니다.

4. Runnable 인터페이스를 구현하여 스레드를 생성하면 유일한 상속 기회를 유지할 수 있을 뿐만 아니라 리소스 공유 작업이 비교적 간단해지기 때문에 일반적으로 이 방법을 사용하여 스레드를 생성합니다.

5. 스레드를 상속하여 리소스 공유 실현:

공유 리소스를 위한 외부 클래스 제공

package com.test.thread.extendsThread;public class MyClass {public int count;

}
스레드 스레드 하위 클래스

package com.test.thread.extendsThread;public class MyThread extends Thread {private MyClass obj;public MyThread() {super();
    }public MyThread(MyClass obj) {super();this.obj = obj;
    }

    @Overridepublic void run() {
        System.out.println("obj=" + obj);while (true) {synchronized (obj) {if (obj.count > 0) {try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "----当前数量=" + obj.count--);
                } elsereturn;
            }
        }

    }

}
테스트 클래스

rreee

 

三 线程生命周期

1.什么是线程的生命周期?

由不同阶段构成的线程从出生到死亡的整个过程,叫做线程的生命周期。

2.线程生命周期的意义

了解线程的生命周期能够更好地掌握线程的运行情况,比如线程的就绪状态,意味着不是调用start方法之后,线程立即执行。

3.生命周期的几个阶段:

  • 出生状态:线程创建完成,尚未开启前的状态。

  • 就绪状态:调用start方法开启线程,线程尚未运行的状态。

  • 运行状态:线程获取CPU时间片执行时的状态。

  • 休眠状态:线程调用sleep方法后进入指定时长的休眠状态,时间结束进入就绪状态。

  • 等待状态:监听对象在线程内部调用wait方法后,线程失去对象锁,进入等待状态。

  • 阻塞状态:线程发出输入或者输出请求后进入阻塞状态。

  • 死亡状态:run方法执行完毕,线程死亡。

四 线程的加入

一个线程A在另一个线程B内部调用join方法,B线程中止,A线程开始执行,A线程执行完毕,B线程才开始执行。

五 线程优先级

线程优先级设定了线程获取CPU时间片的概率,仅仅是一种概率,不能保证优先级高的线程一定优先获得CPU时间片。

线程优先级分为10个等级,从1-10,数值越大,优先级越高,通过setProprity(int)方法设置。

六 线程礼让

Thread.yield,线程礼让只是通知当前线程可以将资源礼让给其他线程,并不能保证当前线程一定让出资源。

七 同步机制

1.什么是线程同步机制?

使得同一资源同一时刻只能有一个线程访问的安全机制,即一个线程访问完毕,其他线程才能访问。

2.同步机制的目的

由于目标资源同一时刻只有一个线程访问,解决了线程安全问题。

3.什么是线程安全问题?

⑴线程安全问题产生条件

  • 多线程并发访问。

  • 存在可修改的共享数据。

⑵第一个线程获取了共享数据,操作结束前,第二个线程修改了该数据,导致第一个线程运算时采用的不是获取时的数据。

4.同步机制解决线程安全问题的原理

synchronized(共享对象){ 修改共享数据的代码 }

上述操作给修改共享数据的代码加了一把对象锁。任何一个对象只有一把对象锁,线程只有获得了对象锁才能访问加锁的资源。一个线程获取了对象锁,执行加锁的代码,执行完毕,归还对象锁,其他线程开始争夺对象锁,访问资源。

5.类锁

synchronized关键字加到静态方法上时,形成类锁,执行该方法上必须获取类锁。

类锁与对象锁是两种不同的锁,允许一个线程持有类锁,另一个线程持有对象锁。

6.synchronized关键字

synchronized关键字加在成员方法,该方法成为同步成员方法,由于一个对象只有一把对象锁,一个线程访问了一个同步成员方法,其他线程不能访问其他同步成员方法。

同步方法不可以被继承,同步方法在子类中失去同步机制。

7.判断条件的设置

在同步机制中,如果同步代码的执行需要满足一定条件,那么将判断条件放在锁内,保证当前获取了锁的线程在执行同步代码时满足执行条件。如果放在锁外,有可能出现当前线程获取了锁以后不满足执行条件的情况。

不存在线程安全问题的做法:

public void run() {
        System.out.println("obj=" + obj);while (true) {synchronized (obj) {if (obj.count > 0) {try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "----当前数量=" + obj.count--);
                } elsereturn;
            }
        }

    }

while 문에 판단 조건 obj.count>0이 있으면 스레드가 while 문에 들어갈 때 count가 1이 되어 조건을 만족하고 들어가서 객체 잠금을 획득하기를 기다리는 일이 발생할 수 있습니다. 현재 객체 잠금을 보유하고 있는 스레드가 실행을 완료하면 카운트가 0이 되고, 대기 중인 스레드가 객체 잠금을 획득하면 동기화 블록이 실행되고 판단 조건이 실패합니다.

8 교착상태

1. 교착상태란 무엇인가요?

스레드 A에는 여러 개의 잠금이 필요합니다. 스레드 B에는 A가 보유한 잠금이 없고 A가 보유한 잠금이 없습니다. 스레드는 모든 잠금을 획득하기 전에 보유하고 있는 잠금을 해제하지 않으므로

이로 인해 스레드 A가 있습니다. 스레드 B가 교착 상태에 빠지고 전체 프로세스가 정지됩니다.

2. 교착상태를 피하는 방법은?

동기화 메커니즘의 잠금 수를 줄이고 동일한 잠금이 여러 위치에 나타나는 것을 방지하세요.

나인 데몬 스레드

1. 사용자 스레드?

일반적으로 생성되는 스레드는 사용자 스레드입니다. 즉, 해당 스레드는 명시적으로 데몬 스레드로 설정되지 않고 데몬 스레드 내부에서 생성되지 않습니다.

2. 메인 스레드는 사용자 스레드에 속합니다.

3. 데몬 스레드란 무엇인가요?

백그라운드에서 실행되며 사용자 스레드에 서비스를 제공하는 스레드입니다.

4. 데몬 스레드 생성

사용자 스레드는 setDaemon(true) 메서드를 호출하거나 데몬 스레드 내부에 스레드를 생성합니다.

5. 데몬 스레드의 역할

데몬 스레드는 가비지 컬렉터와 같은 사용자 스레드에 서비스를 제공하는 데 사용됩니다.

6. 이때 데몬 스레드의 실행이 완료되었는지 여부에 관계없이 모든 사용자 스레드가 실행을 완료한 후에 JVM이 종료됩니다.

7. 데몬 스레드는 백그라운드에서 실행되며 모든 사용자 스레드가 종료되면 자동으로 종료됩니다.

10 wait 및 sleep 메소드 비교

1. 존재 범위

  • wait 메소드는 객체 수준입니다. 즉, Java의 모든 객체에는 toString과 같은 이 메소드가 있습니다.

  • Sleep 메서드는 Thread와 그 하위 클래스에만 존재합니다.

2. 함수

  • sleep은 현재 스레드를 절전 모드로 전환하고 CPU 타임 슬라이스를 해제하며 보유 잠금을 해제하지 않습니다.

  • wait는 스레드 간 통신에 사용되며 개체는 해당 개체를 잠금으로 사용하는 모든 스레드를 관리합니다. 동기화 코드의 잠금 개체에 의해 호출되면 현재 스레드가

    가 보유한 개체 잠금을 해제하게 됩니다.

3. 사용법

  • sleep 메소드는 Thread, Thread.sleep을 통해 직접 호출되는 정적 메소드입니다.

  • 은 동기화 코드에 사용되며 잠금 개체에 의해 호출됩니다.

4. 관련 방법

  • obj.notify(): 객체 리스너에서 스레드를 무작위로 깨우고 객체 잠금 및 CPU 타임 슬라이스를 획득하면 스레드가 준비 상태로 들어갑니다. , 대기가 중지됩니다. 그런 다음 실행하면

    실행 방법이나 동기화 코드를 다시 입력하지 않습니다.

  • obj.notifyAll(): 객체 리스너에서 대기 중인 모든 스레드를 깨우고 모두 준비 상태로 전환합니다.

十一 ThreadLocal

1.线程局部变量,为每一个线程提供一个变量的副本,使得各个线程相对独立地操作变量,避免线程安全问题。

2.首先必须明确一点,ThreadLocal.get()获取的变量副本必须手动传入:

ThreadLocal.set(Object obj)

初次获取时,判断线程局部变量中是否保存有变量副本,如果没有则手动传入,在该线程中下次获取的就是初次传入的对象。

3.ThreadLocal的目的是保证在一个线程内部,一次创建,多次获取。

4.基本原理:
      将初次传入的变量与线程绑定,线程不变,变量不变。

十二 GroboUtils多线程测试

   1.JUnit测试不支持多线程,GroboUtils提供了对多线程测试的支持,使用时需要导入架包。

    2.几个比较重要的类:

  • TestRunnable:实现了Runnable接口,run方法中运行的是runTest方法,runTest方法是一个抽象方法。

  • MultiThreadedTestRunner:负责管理并开启多个线程。

    3.测试步骤

⑴继承TestRunnable,实现其中的抽象方法runTest,将需要运行的代码放入该方法中。通常为子类定义一个有参构造方法,方法形参为需要测试的线程,在runTest方法中调用测试线程的run方法,从而将将需要执行的代码注入runTest方法中。

⑵创建测试线程数组,将需要测试的TestRunnable实现类传入其中:

TestRunnable[] tr=new TestRunnable[len];

⑶根据测试线程数组创建线程管理与运行对象并开启多线程:

MultiThreadedTestRunner mttr=new MultiThreadedTestRunner(tr);
mttr.runTestRunnables();

위 내용은 프로세스와 스레드란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.