JAVA线程的学习笔记

时间:2015-04-17 10:59:37   收藏:0   阅读:141

---恢复内容开始---

线程的使用:

  让线程终止的办法            线程的终止只能由线程自己决定,所以我们在run()方法中使用一个标志位while( BOOlean B)来执行代码

  void join( ) 或者  void join(long millis)假设在A线程中调用B线程的这个方法,A线程会被阻塞。

                       只有在B线程执行完毕或者执行了millis这个参数的时间后,A线程才能恢复执行 

  set Deanon( true)             设置为守护线程,当进程中没有用户线程时,虚拟机退出,默认的是用户线程

  Thread.currentThread()           获取代表当前线程的对象

  sleep(long millis)             使当前线程休眠,但不丢失监视器的状态

  getname()                 获取线程的名字,主线程的线程名字为main 子线程的为Thread0~N依次递增    

              实现Runnable 接口 相对于继承Thread 类的优势 

1、适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效分离,较好地体现了面向对象的设计思想。 


2、可以避免由Java的单继承特性带来的局限性。 

3、有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据。当线程被构造时,需要代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runable接口的类的实例;

多线程实例:

 public class ThreadDemo {

/**
* @param args
*/
    public static void main(String[] args) {

    Mythread my = new Mythread(); //创建一个线程目标
    Thread tr1 = new Thread(my); //创建一个线程,执行线程目标的Run()方法
    Thread tr2 = new Thread(my); //创建第二个线程,这行线程目标的Run()方法
    tr1.start(); //执行第一个线程目标的Run()方法
    tr2.start(); //执行第二个线程目标的Run()方法


  }
    class Mythread implements Runnable{
      private int j =0; //线程目标的属性会被不同线程的Run()方法共享
      @Override
      public void run() { //Run()相当于主函数的main(),不同的是我们只是在Run()是在main开启的
      synchronized (this) { //使用同步代码块,保证同一时间只能有一个线程访问代码块里面的代码,保证数据的安全,this就表示不同线程使用同一个监视器(Mythread的对象)
        for( int i=0;i<5;i++){
        try {
        j++;
        System.out.println(Thread.currentThread().getName()+"J的值"+j);
        Thread.sleep(1000);

        } catch (InterruptedException e) {
       e.printStackTrace();
      }

      }
      }
      }

    }

 

输出的结果为:

Thread-1J的值1
Thread-1J的值2
Thread-1J的值3
Thread-1J的值4
Thread-1J的值5
Thread-0J的值6
Thread-0J的值7
Thread-0J的值8
Thread-0J的值9
Thread-0J的值10

 

    总结:

创建一个线程对象(New Thread(Runnable runnable))并启动(start())这个线程,其实就是开辟一个线程然后执行线程目标(Runnable)

的run( )方法,有几个线程(注意一个线程对象只能被start一次,这里指的是有几个线程对象并且start)就执行几次rum( )方法,rum( )方法就

相当于主函数中的main()方法(如果main( )不处于休眠状态,那么此时有start的次数加1条线程在同时运行)。而runnable的属性和run()是同一层次的,

所以线程目标(Runnable)的属性和方法能被run()共享,也就是能被不同的线程调用和共享.为了保证属性和方法被线程共用的安全性,我们必须使线程有序的使用属性和方法,

这里就引出线程同步的概念,使用

    synchronized(this){ }  //同步代码块,this可以是任何对象,但这个对象必须是所有线程的共同的监视器

    synchronized     //方法修饰符,其监视器是当前线程类的对象,与this作用类似

这两个方法能保证一段代码块或者一个函数完整的执行完后再被下一个线程使用。

 

 

---恢复内容结束---

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!