1.控えめで自然なコールバックのコンセプト
マルチスレッドとは、上司が複数の人に同時に作業を完了するように手配することを意味します。もちろん、上司は各作業の完了を知りたいと考えています。
最も簡単なアイデアは、投票することです。つまり、たまに上司が全員に作業が完了したかどうかを尋ねます。この方法は実行可能ですか?もちろん実行可能ですが、それは上司にとって時間の無駄です。
もちろん、より良いことは、誰もが彼らの仕事を完了した後に報告し、上司に仕事の結果を報告することです。
スレッドの実行後にメインプログラムに結果を積極的に通知するこの方法は、コールバックと呼ばれます。
一見ハイエンドな一見のコールバックにだまされないでください実際には、コールバックは非常に控えめで自然で一般的な考え方です。
2.静的メソッドのコールバック
静的メソッドはグローバルに普遍的であるため、メインプログラムのスレッドで静的メソッドを簡単に呼び出すことができます。
最初にスレッドを確認し、実行後にメインプログラムの静的メソッドをコールバックして、メインプログラムに実行結果を通知します。
/**
* 员工:负责读取文件大小
*/
public class ReadFileMan implements Runnable {
/**
* 文件名
*/
private String fileName;
public ReadFileMan(String fileName) {
this.fileName = fileName;
}
@Override
public void run() {
File f = new File(fileName);
if (f.exists() && f.isFile()) {
// 回调主程序的静态方法
ReadFileBoss.knowFileLength(fileName, f.length());
} else {
// 回调主程序的静态方法
ReadFileBoss.knowFileLength(fileName, f.length());
}
}
}
メインプログラムは比較的単純で、スレッドを開始し、コールバックを待ちます。
/**
* 主程序
*/
public class ReadFileBoss {
public static void knowFileLength(String fileName, long length) {
System.out.println("老板知道了文件[" + fileName + "]大小:" + length);
}
public static void main(String[] args) {
// 启动线程
ReadFileMan readFileMan = new ReadFileMan("D:\\temp\\1.txt");
Thread thread = new Thread(readFileMan);
thread.start();
// 输出:老板知道了文件[D:\temp\1.txt]大小:6
}
}
上記のプログラムでは、ボスのReadFileBossが従業員のreadFileManにファイルサイズを読み取るように指示し、従業員が結果を報告するのを待つだけで済みます。
従業員の場合、実行直後に上司の静的メソッドを簡単に呼び出すことができます。
3.コールバックインスタンスメソッド
もう1つのメソッドは、コールバックインスタンスメソッドです。このモデルは、各従業員が、従業員の毎日の行動を管理し、実行結果を監視する責任を負うマネージャを持つ各従業員に相当します。ボスはマネージャを管理するだけでよく、従業員はマネージャに報告するだけで済みます。
OK、従業員スレッドはそのマネージャーが誰であるかを知る必要があるので、次のように変更します。
/**
* 员工:负责读取文件大小
*/
public class ReadFileMan implements Runnable {
/**
* 文件名
*/
private String fileName;
/**
* 员工需要知道自己的经理是谁
*/
private ReadFileManager readFileManager;
public ReadFileMan(String fileName, ReadFileManager readFileManager) {
this.fileName = fileName;
this.readFileManager = readFileManager;
}
@Override
public void run() {
File f = new File(fileName);
if (f.exists() && f.isFile()) {
// 回调经理的实例方法
readFileManager.knowFileLength(fileName, f.length());
} else {
// 回调经理的静态方法
readFileManager.knowFileLength(fileName, f.length());
}
}
}
マネージャーは従業員を働かせるために整理する必要があり、次にマネージャーはまた仕事の結果を管理する必要があります。
/**
* 经理
*/
public class ReadFileManager {
/**
* 执行结果
*/
public void knowFileLength(String fileName, long length) {
System.out.println("经理知道了文件[" + fileName + "]大小:" + length);
System.out.println("经理根据工作情况进行进一步处理");
}
/**
* 安排工作
*/
public void plan() {
// 启动线程
ReadFileMan readFileMan = new ReadFileMan("D:\\temp\\1.txt", this);
Thread thread = new Thread(readFileMan);
thread.start();
}
}
上司は安心し、マネージャーに直接任せる:
/**
* 主程序
*/
public class ReadFileBoss {
public static void main(String[] args) {
// 把事情交给经理就行了
ReadFileManager manager=new ReadFileManager();
manager.plan();
// 执行结果:经理知道了文件[D:\temp\1.txt]大小:6
}
}
4.まとめ
上記の例から、各マネージャーは複数の従業員を管理できるため(複数の従業員スレッドが1つのマネージャーインスタンスをコールバックするため)、マネージャーに管理を任せるほうがよいことがわかります。各従業員は複数のマネージャーに報告することもできます(従業員はコールバックマネージャーのリストを保存します。これは非常に柔軟です。
インスタンスにスレッドを管理させると、さまざまな管理ロジックを実現でき、拡張が容易になり、オブジェクト指向プログラミングのアイデアに沿ったものになります。
したがって、スレッドデータを取得するには、インスタンスメソッドコールバックを使用することをお勧めします。