プロセスは、データ コレクション上のコードの実行アクティビティです。システム内のリソース割り当てとスケジューリングの基本単位です。スレッドはエンティティです。プロセス内の少なくとも 1 つのスレッド。CPU のスケジューリングと割り当ての基本単位です。プロセス内の複数のスレッドがプロセスのリソースを共有します。
プロセスの 3 つの特徴:
#ダイナミシティ: プロセスは実行中のプログラムであり、占有する必要があります。メモリ、CPU、ネットワークなどのリソースを動的に管理します。
独立性: プロセスは互いに独立しており、独自の独立したメモリ領域を持っています。
同時実行性: CPU がシングルコアの場合、メモリ内で同時に実行されるプロセスは実際には 1 つだけです。 CPU は時分割でポーリングと切り替えを行い、各プロセスを順番に処理します。切り替え速度が非常に速いため、これらのプロセスが同時に実行されているように感じられます。これが並行性です。
プロセス内でスレッドを作成するには 3 つの方法があります:
: Thread クラスを継承する方法
public class ThreadDemo { // 启动后的ThreadDemo当成一个进程。 // main方法是由主线程执行的,理解成main方法就是一个主线程 public static void main(String[] args) { // 3.创建一个线程对象 Thread t = new MyThread(); // 4.调用线程对象的start()方法启动线程,最终还是执行run()方法! t.start(); for(int i = 0 ; i < 100 ; i++ ){ System.out.println("main线程输出:"+i); } } } // 1.定义一个线程类继承Thread类。 class MyThread extends Thread{ // 2.重写run()方法 @Override public void run() { // 线程的执行方法。 for(int i = 0 ; i < 100 ; i++ ){ System.out.println("子线程输出:"+i); } } }
コーディングは簡単です。Thread.currentThread() を使用せずに、これを直接使用して run() メソッドで現在のスレッドを取得するだけです。方法。欠点: thread クラスは Thread クラスを継承しているため、他のクラスを継承できず、継承による関数の拡張ができません (単一継承の制限)。また、タスクとコードが分離されていないため、複数のスレッドで同じタスクを実行する場合、複数のタスクコードが必要になります。
概要:方法Runnableインターフェイスを実装します。
public class ThreadDemo { public static void main(String[] args) { // 3.创建一个线程任务对象(注意:线程任务对象不是线程对象,只是执行线程的任务的) Runnable target = new MyRunnable(); // 4.把线程任务对象包装成线程对象.且可以指定线程名称 // Thread t = new Thread(target); Thread t = new Thread(target,"1号线程"); // 5.调用线程对象的start()方法启动线程 t.start(); Thread t2 = new Thread(target); // 调用线程对象的start()方法启动线程 t2.start(); for(int i = 0 ; i < 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+"==>"+i); } } } // 1.创建一个线程任务类实现Runnable接口。 class MyRunnable implements Runnable{ // 2.重写run()方法 @Override public void run() { for(int i = 0 ; i < 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+"==>"+i); } } }
スレッド タスク クラスは Runnable インターフェイスのみを実装し、引き続き他のクラスを継承し、他のクラスを実装し続けることができます。インターフェイス (単一継承の制限外を避ける)。同じスレッド タスク オブジェクトは、複数のスレッドが同じリソースを共有するのに適した複数のスレッド オブジェクトにパッケージ化できます。分離操作を実現するために、スレッド タスク コードを複数のスレッドで共有でき、スレッド タスク コードとスレッドは独立しています。
方法 3:Callable インターフェイスの実装
public class ThreadDemo { public static void main(String[] args) { // 3.创建一个Callable的线程任务对象 Callable call = new MyCallable(); // 4.把Callable任务对象包装成一个未来任务对象 // -- public FutureTask(Callable<V> callable) // 未来任务对象是啥,有啥用? // -- 未来任务对象其实就是一个Runnable对象:这样就可以被包装成线程对象! // -- 未来任务对象可以在线程执行完毕之后去得到线程执行的结果。 FutureTask<String> task = new FutureTask<>(call); // 5.把未来任务对象包装成线程对象 Thread t = new Thread(task); // 6.启动线程对象 t.start(); for(int i = 1 ; i <= 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+" => " + i); } // 在最后去获取线程执行的结果,如果线程没有结果,让出CPU等线程执行完再来取结果 try { String rs = task.get(); // 获取call方法返回的结果(正常/异常结果) System.out.println(rs); } catch (Exception e) { e.printStackTrace(); } } } // 1.创建一个线程任务类实现Callable接口,申明线程返回的结果类型 class MyCallable implements Callable<String>{ // 2.重写线程任务类的call方法! @Override public String call() throws Exception { // 需求:计算1-10的和返回 int sum = 0 ; for(int i = 1 ; i <= 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+" => " + i); sum+=i; } return Thread.currentThread().getName()+"执行的结果是:"+sum; } }
スレッド タスク クラスは Callable インターフェイスのみを実装し、引き続き他のクラスを継承し、他のインターフェイスを実装し続けることができます (次の制限を回避します)。単一継承)。同じスレッド タスク オブジェクトは、複数のスレッドが同じリソースを共有するのに適した複数のスレッド オブジェクトにパッケージ化できます。分離操作を実現するには、スレッド タスク コードを複数のスレッドで共有し、スレッド タスク コードとスレッドを独立させることができます。最も重要なことは、スレッドの実行結果を直接取得できることです。
以上がJava 並行プログラミング スレッドの作成方法:の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。