> Java > java지도 시간 > 본문

Java 스레드에 대한 자세한 설명 및 스레드와 프로세스의 차이점

高洛峰
풀어 주다: 2017-01-19 11:25:46
원래의
1452명이 탐색했습니다.

자바 스레드에 대한 자세한 설명과 스레드와 프로세스의 차이점

1. 프로세스와 스레드

각 프로세스는 고유한 메모리 공간을 가지며 하나의 애플리케이션이 동시에 여러 프로세스를 시작할 수 있습니다. 시간. 예를 들어 IE 브라우저를 사용하는 경우 IE 브라우저를 여는 것은 프로세스를 시작하는 것과 같습니다.

스레드는 프로세스의 실행 프로세스를 의미합니다. 프로세스에는 여러 스레드가 포함될 수 있습니다.

각 프로세스에는 운영 체제가 독립적인 메모리 공간을 할당해야 하며, 동일한 프로세스의 여러 스레드가 이 공간, 즉 공유 메모리 및 기타 리소스를 공유합니다.

java.exe가 호출될 때마다 운영 체제는 Java 가상 머신 프로세스를 시작합니다. Java 가상 머신 프로세스가 시작되면 Java 가상 머신은 프로그램에서 시작되는 메인 스레드를 생성합니다. 실행을 시작합니다.

JVM(Java Virtual Machine)은 스레드를 시작할 때마다 스레드에 스레드 메서드 스택을 할당하여 관련 정보(예: 지역 변수 등)를 저장하고 스레드는 이 스택에서 실행됩니다. 따라서 Java 객체의 로컬 변수는 스레드로부터 안전하지만 인스턴스 변수와 클래스 변수는 스택에 저장되지 않으므로 스레드로부터 안전하지 않습니다.

프로세스에는 준비, 실행, 차단의 세 가지 상태가 있습니다.

Java 스레드에 대한 자세한 설명 및 스레드와 프로세스의 차이점

2. Thread 생성 방법

실행 가능한 방법: (이 방법은 유연하고 권장됩니다.)

public class Thread02 implements Runnable {
  
  public static void main(String[] args) {
    Runnable r = new <strong>Thread02</strong>();
    Thread t1 = new Thread(<strong>r</strong>, "t1");
    /**
     *   Thread源码
     *   public Thread(Runnable target, String name) {
          init(null, target, name, 0);
             }
     */
    Thread t2 = new Thread(r, "t2");
    t1.start(); // 启动线程t1,处于就绪状态,等待cpu
    t2.start(); // 启动线程t2,处于就绪状态,等待cpu
    t1.run(); // 主线程main调用对象t1的run方法
  }
  
  public void run() {
    System.out.println("thread&#39;s name is "
        + Thread.currentThread().getName());
  }
  
}
로그인 후 복사

실행 결과는 다음과 같습니다:

thread&#39;s name is t1
thread&#39;s name is main
thread&#39;s name is t2
로그인 후 복사

Thead way

public class Thread03 extends Thread {
  
  public static void main(String[] args) {
    Thread03 t1 = new <strong>Thread03</strong>();   //不注意的情况下写成了Thread t1=new Thread()  注:Thread03此时就是一个线程了
    t1.start();
  }
  
  public void run() {
    System.out.println("thread&#39;s name is "
        + Thread.currentThread().getName());
  }
}
로그인 후 복사

실행 결과: 스레드 이름은 Thread-0입니다.

참고: 사용자 정의 스레드 외에도 프로그램이 실행될 때마다 기본 스레드도 있습니다.

일반:

public class Thread01 {
  public static void main(String[] args) {
 
    Thread thread=new Thread();
    thread.start();//真正起作用 的是run()
    /**而Thread中的run
     * public void run() {
      if (target != null) {
        target.run();
      }
      }
      所以自己创建的线程要重写run方法,把要执行的内容放到run()中,所以要实现接口或继承进而产生子类
     */
     
    //创建线程的方式1 thread子类方式(继承)
    Thread thread1=new Thread(){
      public void run() {
        while(true){
          try {
            Thread.sleep(500);//休息500毫秒
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          //Thread.currentThread()得到当前线程
          System.out.println("线程1的名字是 "+Thread.currentThread().getName());
        }
      }
    };
//    thread1.start(); //不写  线程无法启动
     
     
    //创建线程的方式2 runnable方式(实现) 推荐使用
    Thread thread2=new Thread(new Runnable(){
 
      public void run() {
 
        while(true){
          try {
            Thread.sleep(300);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          System.out.println("thread2&#39;name is "+Thread.currentThread().getName());
           
        }
      }});
//    thread2.start();
     
    //执行的是thread
    new Thread(new Runnable(){
      public void run() {
        System.out.println("runnable "+Thread.currentThread().getName());
      }}){
      public void run() { //子类中的run方法覆盖父类中的run方法,这样就不会执行runnable
        System.out.println("thread "+Thread.currentThread().getName());
      }
    }.start();
  }
  /***
   * 在单个cpu中执行多线程很有可能降低执行效率而不是提高 一个人在不同地方做同一件事情
   */
}
로그인 후 복사

읽어주셔서 감사합니다. 모두에게 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!

자바 쓰레드에 대한 더 자세한 설명과 쓰레드와 프로세스의 차이점은 PHP 중국어 홈페이지를 참고해주세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!