1.この記事がある理由
年が明けて2017年に戻ると、時間は飛んでいきます。編集者は自己学習プログラミングと3つの主要なフレームワークを完了しました。自信に満ちていると説明でき 、剣はオファーを指します。
誰もが知っているように、最初のインタビューでは、私はXiao Yang(それほど古くない)インタビュアーからレッスンを受けました;これらの年は過ぎました、そしてそれは私の記憶の中でまだ新鮮です。
- Xiao Yang:さあ、マルチスレッドについて話しましょう
- Aniu:スレッドはプロセスの実行単位です。。。
- Xiao Yang:マルチスレッドを実装するにはいくつかの方法があります
- Ah Niu:2種類(ためらうことなく、まだ知らない!!)
- Xiao Yang:これら2つの違いは何ですか
- アニウ:はい。。。(すぐに混乱するB)
このようにして、パニック状態で私はシャオヤンからのあらゆる種類の拷問を受け入れ、最後に「戻って通知を待つ」で終わりました。
インタビュー後、漠然と結果は推測できますが、天国にも行きたくて、バランスが傾いています。
アニウは数日待っていました が、3つの秋の後、GGで終わりました 。
2.マルチスレッドを実現する方法について話す
小さなパートナープログラムがあることを知っている 文をジャンプしない 前提の下で、ある 上から下へ 順番に。
それで、私はプログラムを設計したいと思います、「コードコード」と「 大ヒット映画(まともな人)を見ます 」、どのように設計しますか?
まず、上記の問題を解決するには、 マルチスレッドについて説明する必要があります。次に、最初にスレッド とプロセスを理解する必要 があり ます。
「Java Programming Thoughts」の 並行モジュールに は、プロセスとスレッドを説明する2つの文があります
プロセス:メモリ内で実行されているアプリケーションプログラムを指します。各プロセスには独立したメモリ領域があります。プロセスは、実際にはプログラムの1回の実行と、プログラムを実行しているシステムの基本単位です。
スレッド:プロセス内の単一の順次制御フローを指します
変換:スレッドは実際にはプロセスの実行単位であり、現在のプロセスでのプログラムの実行を担当します
これら2つの文は少し抽象的ですが、スレッドとプロセスの本質を語っています。
さあ、エディタシステムの「プロセス」を見てみましょう
次に、Xiaobian Computer Managerの「スレッド」を見てみましょう
スレッドとプロセスを理解した後、マルチスレッドは「とても簡単」と表現できます
次に、「2年後」ではなく、マルチスレッドを実現するいくつかの方法について簡単に説明します。
3、Threadクラスを継承し、理解する
もう一度「Bをインストール」し、Threadクラスのソースコードを見てみましょう。
次に、Threadクラスの「start()メソッド」を見てください。
ソースコードから、Threadクラスは本質的にRunnableインターフェースのインスタンスであることがわかります。
したがって、スレッドを開始する唯一の方法は、Threadクラスのstart()メソッドを使用することです。start()メソッドは 、新しいスレッドを開始してrun()メソッドを実行するネイティブメソッドです。
次は、SAO運用の要点です
まず、TestThreadクラスを作成します (きちんとした人、あまり考えすぎないでください)
/**
* Create By CodeCow on 2020/8/3.
*/
public class TestThread {
public static void main(String[] args) {
MyThread mt = new MyThread("新线程————看大片");
//开启新线程
mt.start();
//在主方法中执行for循环
for (int i = 0; i < 5; i++) {
System.out.println("main线程————撸代码,没意思。。" + i);
}
}
//继承Thread类
public static class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称(原理:利用继承特点,将线程名称传递)
super(name);
}
//重写run方法,定义线程要执行的代码
@Override
public void run() {
for (int j = 0; j < 5; j++) {
//getName()方法 来自父亲(就是Thread类中,获取当前线程名称方法)
System.out.println(getName() + " :好刺激哟,不行了,快、快。。" + j);
}
}
}
}
次に、TestThreadを実行して結果を確認しましょう
Connected to the target VM, address: '127.0.0.1:56321', transport: 'socket'
main线程————撸代码,没意思。。0
main线程————撸代码,没意思。。1
新线程————看大片 :好刺激哟,不行了,快、快。。0
main线程————撸代码,没意思。。2
新线程————看大片 :好刺激哟,不行了,快、快。。1
main线程————撸代码,没意思。。3
新线程————看大片 :好刺激哟,不行了,快、快。。2
新线程————看大片 :好刺激哟,不行了,快、快。。3
新线程————看大片 :好刺激哟,不行了,快、快。。4
main线程————撸代码,没意思。。4
Disconnected from the target VM, address: '127.0.0.1:56321', transport: 'socket'
「コードスレッド」と「 ルッキングブロックスレッド 」がそれぞれ5回実行されたことを見つけるのは難しくありません
したがって、このようにスレッドを起動し、直接使用する Threadクラスを継承する独自のクラスを、そして彼のrun()メソッドを書き換える スレッドを開始する、と自分で定義されたrun()メソッドを実行します。この操作は6ではありません!
第4に、Runnableインターフェースを実現し、理解する
今回は、エディターは「Bをインストール」せず、Runnableクラスのソースコードを表示します 。
Runnableインターフェースが「Java1.0」以来利用可能であり、その中に抽象メソッドrun()が1つしかないことをソースコードから見つけることは難しくありません。
したがって、スレッドを開始するには、Runnableインターフェースを実装し、そのrun()メソッドを書き直す必要があります。
- 注:あなたのクラスは、Runnableインタフェースを実装し、その実行を無効にしますスレッドを開始するために、他のクラスを継承している場合、Javaは、多重継承をサポートしないためには、()メソッドは 、全体の波の実用的な操作を、是非します
まず、TestRunnableクラスを作成し、Runnableインターフェースを実装します。
/**
* Create By CodeCow on 2020/8/3.
*/
public class TestRunnable implements Runnable{
//重写run()方法, 写自己需要的代码
@Override
public void run() {
for (int i = 0; i < 5; i++) {
//currentThread() 返回对当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName()+" :好刺激哟,不行了,快、快。。" + i);
}
}
public static void main(String[] args) {
//创建自定义类对象 线程任务对象
TestRunnable mr = new TestRunnable();
//创建线程对象
Thread t = new Thread(mr, "新线程————看大片(正经人别多想)");
t.start();
for (int i = 0; i < 5; i++) {
System.out.println("main线程————撸代码,没意思。。" + i);
}
}
}
次に、TestRunnableを実行して、結果がどうなるかを見てみましょう
Connected to the target VM, address: '127.0.0.1:56275', transport: 'socket'
main线程————撸代码,没意思。。0
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。0
main线程————撸代码,没意思。。1
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。1
main线程————撸代码,没意思。。2
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。2
main线程————撸代码,没意思。。3
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。3
main线程————撸代码,没意思。。4
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。4
Disconnected from the target VM, address: '127.0.0.1:56275', transport: 'socket'
「Code Thread」と「Looking Block Thread」もそれぞれ5回実行されていることを見つけるのは難しくありません 。安定した
Stableは安定していますが、多くの人はこれがLowと書かれていないと間違いなく考えるでしょう。
結局のところ、JDKは15点にほとんど達しておらず、8でも「Lambda」はまだ使用できません。!!
是非、ラムダ式+匿名内部クラスを使用し てSAO操作を確認してください
/**
* Create By CodeCow on 2020/8/3.
*/
public class TestRunnableByLambda {
public static void main(String[] args) {
new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("新线程————看大片(别多想) :好刺激哟,不行了,快、快。。" + i);
} }).start(); for (int i = 0; i < 5; i++) {
System.out.println("main线程————撸代码,没意思。。" + i);
} }}
結果は自明です。また、「コードスレッド」と「ルッキングブロックスレッド」がそれぞれ5回実行されたことも
もちろん、実際の開発では、前の記事「約束してください、もうリクエストパラメータを確認しないでください」ほど単純ではありません。
つまり、3 + 2-5 * 0ほど単純ではありません。
要求がある場合:非同期実行スレッドは、実行が完了した後で現在のスレッドに値を返す必要があり、現在のスレッドは他のいくつかのビジネス操作を行うためにこの値に依存する必要があります。
今何をする!パニックしないでください、Callableはここにあります
5、呼び出し可能な理解
同様に、誰でもCallableクラスのソースコードを見てみましょう
Callableインターフェース がJava 1.5で登場し始め 、戻り値を持つcall()メソッドが1つしかないことがわかります 。
それで、問題は、戻り値を持つスレッドボタンをどのように書くのですか?
落ち着いて私のパフォーマンスを見て
まず、TestCallableクラスを作成し、Callableインターフェースを実装します。
/**
* Create By CodeCow on 2020/8/3.
*/
@Slf4j
public class TestCallable implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool(); TestCallable testCallable = new TestCallable();
Future<String> future = executorService.submit(testCallable); log.info("future: " + future.get()); //get会阻塞
executorService.shutdown();
}
@Override
public String call() throws Exception {
return "带含有返回值的线程";
}
}
次に、TestCallableを 実行して結果を確認します
Connected to the target VM, address: '127.0.0.1:57004', transport: 'socket'
03:45:08.723 [main] INFO com.codecow.mini.test.TestCallable - future: 带含有返回值的线程
Disconnected from the target VM, address: '127.0.0.1:57004', transport: 'socket'
見るのは難しくありません、何を見るのか。。。。
追記
さて、あなたは最初にここに話しました、この記事は単に それを開始し、浅い話でいくつかの方法で「マルチスレッド」を実現しました。
第二に、もし私が2年前に同様の記事を読み、「本をもっと読み、新聞をもっと読み、自慢を減らし、そしてもっと眠る」ことができたなら、「小楊」を通り過ぎなかっただろう。おい!2年。
作者:CodeCow
リンク:https://juejin.im/post/6856813848322965512
出典:ナゲット