Java多线程

写作的人

「かずきち」是一个多元化经营各种服务的平台,包括编程学习服务、宠物沙龙预约服务、娱乐场所搜索服务等等。
以下是平台运营的部分服务:

TOP


http://webukatu.com/
从新宿的主持人转行为房地产和保险销售员,经过3个月的自学,从对HTML一无所知到学习编程和设计,在IT行业工作了一年的实践经验,年收入超过一本。目前作为创业家从事服务运营和房地产管理工作。
也在Qiita上写了一些相关文章。
13个赚钱的重要事项,程序员必读
18个希望想创办WEB服务的人能够阅读的事项

目录

1.1 线程的使用方法
1.2 启动多个线程时的注意事项
1.3 线程的状态和周期
1.4 连接线程(join)
1.5 线程的同步化(Synchronized)

线程

如果想要在后台执行处理,或者想要进行并行处理,可以使用线程机制,因为JVM是顺序执行处理的。就好像有多个JVM并行处理一样,能够产生分身的效果。

如何使用主题讨论。

是否继承Thread类使用或实现Runnable接口使用

import java.util.*;
class SampleThread implements Runnable{ //スレッド定義。Runnnableインターフェースを実装する
  public void run(){  //スレッドを実行するとこのrun()内の処理がされる
    for(int i=0; i<10 ; i++){
     System.out.println(i);
    }
  }
}
public class Sample{
  public static void main(String[] args){
    System.out.println("入力してください");
    Thread t = new SampleThread(); //SampleThreadのインスタンス作成
    t.start(); //別スレッド開始
    new Scanner(System.in).nextLine(); //入力処理
  }
}

※run()函数执行完毕后会自动消失,所以不需要停止或关闭的指令。

多线程启动时的注意事项

JVM通过快速切换多个线程,表面上看起来同时处理这些线程。
切换是通过使用操作系统的调度功能来实现的,因此无法知道哪个线程会按照什么顺序执行。(无法控制执行顺序)

线程状态和周期

线程在以下状态和循环中运行。

初期状態 ⇒ 実行可能(プール)⇒ 実行中 ⇒ 終了
                      ⇒ 実行不可能(待機、スリープ、ブロック) ⇒ また実行可能へ
○初期状態 ・・・ newでオブジェクトが作成された状態。
○実行可能状態 ・・・ startメソッドを実行した時。実行可能な状態になっただけで、まだ実行はされない。
            スケジューラは実行可能状態のスレッドの中から独自の規則で実行していく。
○実行中 ・・・ 実行されてる
○実行不可能状態 ・・・ waitやsleepメソッドを実行した場合や、その他の事情で実行不可能へ。
             実行不可が解消されるとまた実行可能状態になる。
○終了 ・・・ runメソッドが完了した状態。一度終了したスレッドは二度とstarメソッドを実行できない。

织成线

如果那边的线程没有结束,这边的线程就无法执行处理。在这种情况下,可以使用join方法将线程连接起来。

class Sample implements Runnable{
 public void run(){
    for(int i=0; i<10; i++){
       System.out.println("スレッド実行中です");
    }
 }
}
public class Exec{
  public static void main(String[] args){
    Sample sp = new Sample();
    Thread t = new Thread(sp);
    t.start();
    try{
       t.join();
    }catch(InterruptedException e){ //joinはチェック例外のInterruptedExceptionを投げる
       e.printStackTrace();
    }
    System.out.println("mainスレッドが終わりました");
  }
}

线程同步

在多个线程中操作一个对象可能会导致意外的结果,因此在这种情况下需要进行同步。(例如,尝试在多个线程中将相同的变量递增并显示结果时,可能不会按照预期的顺序变为“12345…”)

class Sample implements Runnnable{
  int i=0;
  pubic void run(){ adder(); }
  public void adder(){
    i++;
    System.out.println(Thread.currentThread().getName()+":"+n);
  }
}
public class Exec{
  public static void main(String[] args){
     Runnable r = new MyRunnable();
     Thread t1 = new Thread(r,"A");
     Thread t2 = new Thread(r,"B");
     Thread t3 = new Thread(r,"C");
     Thread t4 = new Thread(r,"D");
     t1.start(); t2.start(); t3.start(); t4.start();
  }
}

通过给代码添加 synchronized 关键字,可以让其作为一块连续的处理执行,以实现同步化。

class Sample implements Runnnable{
  int i=0;
  pubic void run(){ adder(); }
  synchronized public void adder(){
    i++;
    System.out.println(Thread.currentThread().getName()+":"+n);
  }
  synchronized public
}
public class Exec{
  public static void main(String[] args){
     Runnable r = new MyRunnable();
     Thread t1 = new Thread(r,"A");
     Thread t2 = new Thread(r,"B");
     Thread t3 = new Thread(r,"C");
     Thread t4 = new Thread(r,"D");
     t1.start(); t2.start(); t3.start(); t4.start();
  }
}

具有”synchronized”关键字的方法有一个锁,当该方法正在被拥有锁并执行的线程时,其他线程无法使用该线程。

广告
将在 10 秒后关闭
bannerAds