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);