马士兵 note6

第九章 多线程

线程是一个程序内部的顺序控制流

线程和进程的区别:

每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销

线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有独立的运行栈和程序计数器,线程切换的开销小

多进程:在操作系统中能同时运行多个任务(程序

多线程:在同一应用程序中有多个顺序流同时执行

 

  • Java的线程是通过java.lang.Thread类来实现的
  • VM启动时会有一个由主方法(public static void main())所定义的线程
  • 可以通过创建Thread的实例来创建新的线程
  • 每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体
  • 通过调用Thread类的start()方法来启动一个线程

线程的创建和启动

第一种

定义线程类实现runnable接口

Thread myThread = new Thread(target)//target为Runnable接口类型

Runnable中只有一个方法:public void run();用于定义线程运行体

使用Runnable接口可以为多个线程提供共享的数据

在实现runnable接口的类的run方法定义中可以使用Thread的静态方法:

Public static Thread currentThread()获取当前线程的引用

public class ThreadTest1 {

    public static void main(String arg[]) {
        Runner1 runner1 = new Runner1();
        //runner1.run();
        Thread t = new Thread(runner1)    ;
        t.start();
        for(int i = 1;i<100;i++) {
            System.out.println("Main said---"+i);
        }
    }
}

class Runner1 implements Runnable{
    public void run() {
        for(int i = 1;i<100;i++) {
            System.out.println("Thread said"+i);
        }
    }
}

 

第二种

可以定义一个Thread的子类并重写其run方法如:

Class Mythread extends Thread{

                               Public void run(){}

}

然后生成该类的对象:

MyThread myThread = new MyThread()

 

只要能只用接口,就不要用thread类继承

isAlive() 判断线程是否还活着,即线程是否还未终止

getPriority() 获得线程的优先级数值

setPriority() 设置线程的优先级数值

Thread.sleep()将当前线程睡眠指定毫秒数

join()调用某线程的该方法,将当前线程与该线程合并,即等待该线程结束,再回复当前线程的运行

yield()让出cpu,当前线程进入就绪队列等待调度

wait()当前线程进入对象的wait pool

notify()/notifyAll()唤醒对象的wait pool中的一个/所有等待线程

 

sleep方法

可以调用Thread的静态方法;

public static void sleep(long milis) throws InterruptedException   使得当前线程休眠

由于是静态方法,sleep可以直接由类名调用: Thread.sleep(...)

join方法

合并某个线程,相当于方法调用

yield方法

让出CPU,给其他线程执行的机会

设置优先级:t1.setPriority(Thread.NORM_PRIORITY=3)

线程同步

synchronized 锁定当前对象

 

public synchronized void add(String name) {
        num++;
        try {Thread.sleep(1);}
        catch (InterruptedException e) {}
            // TODO: handle exception
            System.out.println(name+",you're the NO."+num+"...");
        
    }

 

在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性

生产者消费者问题

wait() notify()

wait() sleep():

wait时别的线程可以访问锁定对象,调用wait方法的时候必须锁定该对象

sleep时别的线程也不可以访问锁定对象

 

posted @ 2017-09-06 11:38  轩J  阅读(151)  评论(0)    收藏  举报