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编辑  收藏  举报

导航