`
zheng0324jian
  • 浏览: 181230 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java的线程问题--线程

    博客分类:
  • java
 
阅读更多

java的线程可以并发的处理任务

一、创建线程的方式 有两种:

1 继承Thread类
    a 继承Thread类, 覆盖run()方法, 提供并发运程的过程
    b 创建这个类的实例
    c 使用start() 方法启动线程

2 实现Runnable接口
    a 实现Runnable接口, 实现run()方法, 提供并发运程的过程
    b 创建这个类的实例, 用这个实例作为Thread构造器参数
      创建Thread类.
    c 使用start() 方法启动线程

例如:

  class Foo implements Runnable{
    	public void run(){
    		//....
    	}
    }
    Thread t = new Thread(new Foo());
    t.start();

 可以使用 Thread.currentThread() 方法获得当前线程的引用。

这两种方式的区别,主要是关于共享资源,例如,售火车票的程序:共有100张票,四个售票口,每一个窗口只要售票都会使总票数-1,并且锁定正在出售的票,那么每个窗口都是一个线程,如果用第一种方式创建新的线程,那么他们每个线程操作的票数都是各自的私有资源,如果Runnable接口的实现类里面定义总票数,用实现类作为参数创建新线程,这样四个线程操作的车票资源就是同一个。

 

二、线程状态:
  1 new (新建)
  2 Runnable
  3 Running
  4 Block        阻塞
  5 Dided      

 

三、线程的同步
  1 多个线程并发读写同一个临界资源时候会发生线程安全问题
  2 可以使用 同步代码块解决 同步读写临界资源, 解决并发安全问题.

  3 a 同步代码块
        synchronized(同步监视器){
        }
     b 同步监视器 是一个任意对象实例. 是一个多个线程之间的互
        斥的锁机制. 多个线程要使用同一个"监视器" 实现同步互斥
     c  常见写法:
         synchronized(this){
         }
     d  如果方法的全部过程需要同步, 可以简单使用 synchronized
         修饰方法.

 

例子:

1 StringBuffer 是同步的
      synchronized append();
    StringBuilder 不是同步的
      append();
  2 Vector 和 Hashtable 是同步的
    ArrayList 和 HashMap 不是同步的
    
  3 Collections.synchronizedList()
   ArrayList list = new ArrayList();
   List syncList = Collections.synchronizedList(list);
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics