多线程(一)

来源:互联网 发布:方便面 数据报告 编辑:程序博客网 时间:2024/05/17 08:57

多线程的目的:更高效的利用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);        }    }}
复制代码