Java多线程
写作的人
「かずきち」是一个多元化经营各种服务的平台,包括编程学习服务、宠物沙龙预约服务、娱乐场所搜索服务等等。
以下是平台运营的部分服务:
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”关键字的方法有一个锁,当该方法正在被拥有锁并执行的线程时,其他线程无法使用该线程。