多线程的目的:更高效的利用CPU
创建任务和线程
一个任务类必须实现Runnable接口,任务必须从线程运行。
实现Runnable接口
// 任务类 public class TaskClass implements Runnable { public TaskClass(){ } @Override // 实现Runnable中的run方法 public void run() { // 将要运行的任务 } }
创建并运行任务
public class Client { public void someMethod(){ //新建任务的实例 TaskClass task = new TaskClass(); //创建一个线程 Thread thread = new Thread( task ); //开始线程运行任务 thread.start(); //这里若是 task.run(), 并没有运行新的线程 } }
多线程的创建有二种方法:
1. 可以从Thread类从继承(因为Thread类实现了Runnable,但这方法将任务和运行任务机制混合在一起,并不推荐)
class CustomThread extends Thread{ public CustomThread(){ } //改写Thread中的run方法 public void run(){ } public static void main(String[] args) { CustomThread thread1 = new CustomThread(); thread1.start(); } }
2. 实现Runnable方法
运行测试
package MultiThread; public class TaskThreadDemo { public static void main(String[] args) { /* 输出的次数越多越明显 */ Runnable printA = new PrintChar('A', 20); Runnable printB = new PrintChar('B', 20); Runnable printC = new PrintChar('C', 20); Thread threadA = new Thread(printA); Thread threadB = new Thread(printB); Thread threadC = new Thread(printC); /* * A,B,C 任意排序 * BCCCCAAAAAAAAAAAACCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBAAAAAAAA * ACCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAABBBBB * ACCCCCCCCCCCCCCCCCCCCBAAAAAAAAABBBBBBBBBBBBBBAAAAAAAAAABBBBB */ threadA.start(); threadB.start(); threadC.start(); /* * A,B,C 任意排序 * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCBBBBB * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBCBCBCCCCCCCCCCBCCCBCCCCCBBBBB * ACCCCCCCCCCCCCCCCCCCCBAAAAAAAAABBBBBBBBBBBBBBAAAAAAAAAABBBBB */ // threadA.start(); // threadB.start(); // printC.run(); /* * A 在任意位置, B 一定在 C 的前面 * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC * BBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAA * BAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC * BBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCAAAAAAAAAAAACCCCCCCCAAAAAAAA */ // threadA.start(); // printB.run(); // printC.run(); /* * A, B, C 顺序 * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC */ // printA.run(); // printB.run(); // printC.run(); } } class PrintChar implements Runnable { private char charToPrint; private int times; PrintChar(char charToPrint, int times) { this.charToPrint = charToPrint; this.times = times; } @Override public void run() { for (int i = 1; i <= times; ++i) { System.out.print(charToPrint); } } }