多线程的学习1

概念

运行程序会创建一个进程。但OS调度的最小单元是线程(轻量级进程)。

普通的java程序包含的线程:

6:Monitor Ctrl-Break  //监听中断信号

5:Attach Listener  //获取内存dump,线程dump

4:Signal Dispatcher  //z将信号分给jvm的线程

3:Finalizer  //调用对象的finalizer 方法

2:Reference Handler  //清除Reference

1:main //程序的主入口

    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        ThreadInfo[] var3 = threadInfos;
        int var4 = threadInfos.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            ThreadInfo threadInfo = var3[var5];
            System.out.println(threadInfo.getThreadId() + ":" + threadInfo.getThreadName());
        }

    }

为什么要用线程?

1、充分利用多处理核心;多CPU系统中,使用线程提高CPU利用率

2、更快的响应时间;耗时的操作使用线程,提高应用程序响应;并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。

创建线程的方法

extends Thread

implements Runnable

启动线程:threadl类的start()

线程完成:1、run()方法执行完成;2、抛出一个未处理的异常导致线程的提前结束

取消和中断

不安全的取消:

 单独使用一个取消标志位.

Stop(),suspend(),resume()是过期的api,很大的副作用,容易导致死锁或者数据不一致

如何安全的终止线程

使用线程的中断 : 

interrupt() 中断线程,本质是将线程的中断标志位设为true,其他线程向需要中断的线程打个招呼。是否真正进行中断由线程自己决定。

isInterrupted() 线程检查自己的中断标志位

静态方法Thread.interrupted() 将中断标志位复位为false

由上面的中断机制可知Java里是没有抢占式任务,只有协作式任务。

为何要用中断,线程处于阻塞(如调用了java的sleep,wait等等方法时)的时候,是不会理会我们自己设置的取消标志位的,但是这些阻塞方法都会检查线程的中断标志位。

线程的状态

新创建   线程被创建,但是没有调用start方法

可运行(RUNNABLE)  运行状态,由cpu决定是不是正在运行

被阻塞(BLOCKING)  阻塞,线程被阻塞于锁

等待/计时等待(WAITING) 等待某些条件成熟

被终止  线程执行完毕

线程的优先级:

成员变量priority控制优先级,范围1-10之间,数字越高优先级越高,缺省为5,创建线程时setPriotity()可以设置优先级,不要指望他发挥作用。

Daemon线程

守护型线程(如GC线程),程序里没有非Daemon线程时,java程序就会退出。

线程常用方法

run()和start()

run就是一个普通的方法,跟其他类的实例方法没有任何区别。

Sleep

不会释放锁,所以我们在用sleep时,要把sleep放在同步代码块的外面。

yield()

当前线程出让cpu占有权,当前线程变成了可运行状态,下一时刻仍然可能被cpu选中,不会释放锁。

wait()和 notify()/notiyfAll()

调用以前,当前线程必须要持有锁,调用了wait() notify()/notiyfAll()会释放锁。

等待通知机制:

线程 A调用了对象O的wait方法进入等待状态,线程 B调用了对象O的notify方法进行唤醒,唤醒的是在对象O上wait的线程(比如线程A)

notify() 唤醒一个线程,唤醒哪一个完全看cpu的心情(谨慎使用)

notiyfAll() 所有在对象O上wait的线程全部唤醒(应该用notiyfAll())

join方法

线程A,执行了thread.join(),线程A等待thread线程终止了以后,A在join后面的语句才会继续执行

猜你喜欢

转载自my.oschina.net/u/3647713/blog/1790353