Java 多线程
实现多线程的三种方式
1.创建线程类继承Thread.重写run 方法,调用时使用该类的对象的start方法启动.
2.创建类实现Runnable接口.重写run方法.调用时将该类的对象作为参数创建新的线程,调用新线程的start方法启动.
3.匿名类:直接新建一个Thread的匿名类对象,重写run方法.
Thread t = new Thread{
public void run(){
...
}
};
t.start();
常见线程方法.
1.sleep.暂停当前线程Thread.sleep(1000); 表示暂停1s
2.join.加入当前线程中.等待加入线程执行完毕后才继续执行.
3.setPriority设置优先级.
4.yield.暂停
5.setDaemon(true)守护线程.
Synchronized
1.所有的对象都可以作为同步对象使用,使用synchronized(object)声明对object的占用,同时只能有一个对象占用object.
2.用synchronized关键字修饰方法使得同时只能由一个线程访问该方法.
public synchronized void f(){}
3.一个所有方法都由synchronized方法修饰的类是线程安全的类.(HashTable,StringBuffer,Vector)
4.可以用Collections工具类的synchronizedList方法让一个非线程安全的类转换为线程安全的类
5.wait,nofity,notifyAll
线程池ThreadPoolExecutor.
ThreadPoolExecutor threadPool= new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
threadPool.execute(new Runnable(){
public void run(){}
}
像这样创建一个保持10线程,最大15线程,60s后减少线程到10的线程池并执行一个新的任务.
lock对象.
不同于Synchronized,lock在代码层面实现同步功能,可以自定义等待时间避免死锁.可以使用trylock方法在尝试一段时间后放弃占用.
await,signal,signalAll
Lock lock = new ReentrantLock();
Thread t1 = new Thread() {
public void run() {
boolean locked = false;
try {
log("线程启动");
log("试图占有对象:lock");
locked = lock.tryLock(1,TimeUnit.SECONDS);
if(locked){
log("占有对象:lock");
log("进行5秒的业务操作");
Thread.sleep(5000);
}
else{
log("经过1秒钟的努力,还没有占有对象,放弃占有");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if(locked){
log("释放对象:lock");
lock.unlock();
}
}
log("线程结束");
}
posted on 2019-08-14 09:21 Best_Efforts 阅读(99) 评论(0) 编辑 收藏 举报