java中实现多线程常用的方法有以下三种:
/*** 方法一:继承Thread类,重写run方法
*
* @author qd
*
*/
public class MyThread extends Thread {
@Override
public void run() {
super.run()
}
}
/**
* 方法二:实现Runnable接口,,重写run方法
*
* @author qd
*
*/
class MyThread1 implements Runnable {
@Override
public void run() {
}
}
/**
* 方法三:实现Callable<T>接口,重写call方法
* 优点:可以传参数,有返回值类型(参数与返回值类型一致)
*
* @author qd
*
*/
class MyThread2 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return null
}
}
线程同步主要有以下种方法(示例中是实现计数的功能):
1、同步方法,即使用synchronized关键字修饰方法,例如:
public synchronized void add(int c){...}2、同步代码块,即有synchronized关键字修饰的语句块,例如:
public void addAndGet(int c){synchronized(this){
count += c
}
}
3、使用特殊域变量(volatile)实现线程同步,该方法不能保证绝对的同步。
例如:private volatile int count = 0
4、使用锁实现线程同步,例如:
private Lock lock = new ReentrantLock()public void add(int c) {
lock.lock()//上锁
try{
count += c
}finally{
lock.unlock()//解锁
}
}
5、使用原子变量实现线程同步,在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,例如:
private AtomicInteger count= new AtomicInteger(1)public void add(int c) {
count.addAndGet(c)
}
6、使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。
ThreadLocal 类的常用方法
new ThreadLocal<T>() : 创建一个线程本地变量
get() : 返回此线程局部变量的当前线程副本中的值
initialValue() : 返回此线程局部变量的当前线程的"初始值"
set(T value) : 将此线程局部变量的当前线程副本中的值设置为value
示例代码:
private static ThreadLocal<Integer> count= new ThreadLocal<Integer>(){@Override
protected Integer initialValue(){
return 1
}
}
public void add(int c){
count.set(count.get() + c)
}
7、使用阻塞队列实现,例如LinkedBlockingQueue,具体使用可百度LinkedBlockingQueue的用法或查看java文档。