Wednesday, 22 October 2014

多线程

进程与线程
多进程:在操作系统中能(同时)运行多个任务(程序)
多线程(multiple thread):在同一应用中有多个顺序流(同时)执行

线程lifecycle
线程类

//使用线程的方法一:继承Thread类
class FirstThread extends Thread(){
    //编写Run方法
    public void run(){
        for(int i = 0; i < 100; i++){
            System.out.println("");
        } 
    }
}

class Test{
    public static void main(String args[]){
        //生成线程类对象
        FirstThread ft = new FirstThread();
        //启动线程 ,使用start()方法,继承于Thread class
        //ft.run(); 单线程,不能这样写
        ft.start();//多线程
    }
}
Test class里有三个线程,将两个,一个是ft对象代表的线程,一个是Main()线程,(还有一个垃圾回收线程),CPU资源的分配是随机的。

//使用线程的方法二:接口Runnable
class runnableImp1 implements Runnable{
    public void run(){
        for(int i = 0; i < 100; i++){
        System.out.println("...");
        }
    }
}

class Test{
    public static void main(String args[]){
    //生成一个Runnable接口实现类的对象
    RunnableImpl ri = new RunnableImpl();
    //生成一个Thread对象,并将Runnable接口实现类的对象作为参数
    //传递给该Thread对象
    Thread t = new Thread();
    //通知Thread对象,执行start方法
    t.start();
    }
}

Java只支持单继承,推荐使用Runnable接口类

线程的简单控制方法
 - 中断线程
    Thread.sleep()
    Thread.yield()
 - 设置线程的优先级(1 - 10)
    getPriority()
    setPriority() by default, 优先级为5
优先级越大,执行的概率越大。

线程访问安全性
class MyThread implements Runnable{
    int i = 100;
    public void run(){
        while(true){
            //同步代码块
            synchroized(this){
                System.out.println(Thread.currentThread().getName() + i);
                i--;
                Thread.yield();
                if(i < 0){
                    break;
                }
            }
        }
    }
}

class Test{
    public static void main(String args[]){
        MyThread myThread = new MyThread();
        //生成两个Thread对象,共用同一个线程体
        Thread t1 = new Thread(myThread);
        Thread t2 = new Thread(myThread);
        //每一个线程都有名字,可以通过Thread对象setName()设置线程名字,也可以使用getName()获取线程的名子。
        t1.setName("线程a");
        t2.setName("线程b");
 
        t1.start();
        t2.start();
    }
}

多线程访问同一份资源,会出现多线程错误。解决方法:使用同步锁synchronized(this)

深入synchronized关键字
同步代码块(锁住对象)与同步方法作用类似,区别是同步代码块直接指定对象,同步方法也是指this。

No comments:

Post a Comment