Java线程简析

来源:互联网 发布:excel如何去除重复数据 编辑:程序博客网 时间:2024/06/06 00:02

线程

软件中并发的执行过程(方法)。

并发

操作系统采用分时调度策略将多个程序交替运行,宏观上,就是几个程序同步后执行。

java中的多线程编程

Thread

Thread 线索,线程。
Thread 封装了操作系统对线程的地调度过程。

使用Thread类创建线程
1. 继承Thread类,继承了复杂的线程管理功能。
2. 重写run方法,就是并发执行的方法,线程执行时候,将执行修改以后的run方法。
3. 用start方法,启动线程:将线程交付给操作系统,由操作系统负责调度管理。

直接执行run方法,就不是线程执行了
线程代码

class MyThread extends Thread{      public void run(){          System.out.println("HelloWorld");    }  }MyThread t = new MyThread();t.start();  

线程实现

  1. 继承Thread
  2. 重写run方法
  3. 创建线程对象

使用Runnable 接口

  1. 实现Runnable接口,实现run方法。
  2. 创建接口的子类实例。
  3. 创建线程对象,讲接口的子类实例作为线程参数。
  4. 调用用start方法,启动线程。
  5. 使用实现Runnable接口,可以更好的避免由于Java单继承特性,
    导致的扩展性难,同时实现了线程的共享性

案例:

    class MyRunner implements Runable{        public void run(){            System.out.println("Hello World");        }    }    //启动线程    MyRunner runner = new MyRunner();    Thread t = new Thread(runner);    t.start();>使用Runnable接口创建线程的好处是,当前的可以继承于其他的类,>也可以继承其他的接口。

线程的状态

  • new 是新建状态,使用new运算创建线程对象,是线程的初始状态。
  • Runnable 可运行状态,也称就绪状态,线程已经交接给操作系统,由操作系统负责调用,等待合适的时机准备运行。
  • Running 正在运行状态,操作系统分配时间片给线程,线程调度到CPU执行。
  • Delete 线程结束状态,线程结束了run方法,线程将会被垃圾回收器回收,死亡线程将不会再被调用。

  1. Java启动的时候,会自动创建并启动主线程。
  2. main方法被主线程调用。

线程优先级表

  • 默认优先级5
  • 最高优先级 10
  • 最低优先级 1
  • 优先级高的线程,获取CPU时间片多,执行机会多
  • 但是在计算机资源丰富的情况下,运行结果不明显

守护线程

  • 守护线程与普通线程并没有什么区别,我们只需要通过Thread提
    供的方法来设定即可
    • void setDaemon(boolean)
    • 当参数为true时该线程为守护线程
  • 守护线程的特点是:当进程中只剩下为守护线程时,所有守护线程强制终止
  • GC就是运行在一个守护线程上的

    当全部前台线程结束的时候,如果后台线程还没有结束
    这时候,守护线程结束,不会执行后面的操作


CyclicBarrier和CountDownLatch

都可以用来让一组线程等待另一组线程。但是CyclicBarrier可以重复
使用,CountDownLatch不可重复使用,就是直到等待线程全部结束后
使用


管程锁定规则,程序次序规则,volatile变量规则,

  • 程序次序规则:线程内代码能够按先后顺序执行。
  • 管程锁定规则:对于同一个锁,一个解锁操作一定要发生在(时间上)
    另一个锁操作之前。
  • volatile变量规则:前一个对volatile的写操作在后一个volatile
    的读操作之前。
    • volatile是一个特殊的修饰符,,只有成员变量才能使用它。
      在Java并发程序缺少同步类的情况下,多线程对成员变量操作对
      其他线程时透明的。
    • volatile变量可以保证下一个读取操作会在前一个写操作之后
      发生。
  • 线程启动规则:一个线程的所有操作均在线程启动之后。
  • 终止规则:所有的线程操作均在线程终止之前完成。
  • 对象终结规则:一个对象的终结操作必须发生在对象构造完成之后。
  • 可传递性

Sleep


  • 用于使程序进行适当休眠。
  • 唤醒机制,用于两个线程之间进行协调工作。

线程进入sleep block 时候,线程不占用处理器,操作系统可以讲处
理器分配给其他的线程,线程只有在running的时候才占用处理器

6/5/2017 9:08:49 PM

yeild()方法

线程停下来等待另一个线程(主动放弃当前对处理器的调用)

jion()方法

两个或者多个线程协调,一个线程必须结束另一个线程才能开启

public class ThreadDemo2{    public static void main(String[] args){        T1 t1 = new T1();        T2 t2 = new T2();        List<Integer> list = new ArrayList<Integer>();        t1.list = list;        t2.list = list;        t1.t2 = t2;        t2.t1 = t1;        t1.start();        t2.start();    }}class T1 extends Thread{    List<Integer> list;    public void run(){        for(int i = 0;i<10;i++){            list.add((int)(Math.random()*100));             }        System.out.println("T1:"+list);    }}class T2 extends Thread{    List<Integer> list;    T1 t1;    public void run(){        try{            t1.join();            //t1线程正常结束            Collections.sort(t1);            System.out.println("T2" + list);        }catch(InterruptedException e){            e.printStackTrace();        }    }}   
原创粉丝点击