编程学习笔记

<<java编程思想>>笔记:并发1

2018-09-29  本文已影响12人  烛火的咆哮

回顾

  1. 图解: 未命名文件.png

其中:

  1. 常用实现
public class Test implements Runnable {

    public void run() {
        // 只需要实现run方法即可

    }

    class test extends Thread {
        // 重写从thread继承的 run方法
        public void run() {

        }
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.run();
        test t2 = t.new test();//使用.new从外部类访问内部类
        t2.start(); //继承Thread的话 需调用start()方法先进入就绪状态
    }
  1. 使用Executors线程池
public class CachedThreadPool {
    public static void main(String[] args) {
        // 创建一个缓冲线程池服务,输入参数则创建固定线程个数的线程池
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0; i < 5; i++) {
            // 线程池服务启动线程
            final int j = i;
            exec.execute(new Runnable() {
                // 匿名内部类实现线程
                public void run() {
                    System.out.println("Thread " + j + " is running");
                }
            });
            // 线程池服务停止
        }
        exec.shutdown();
    }
}
  1. 获取线程返回值,实现Runnable接口的线程没有返回值, 需要额外实现Callable接口.
public class CachedThreadPool {
    //创建一个继承自Callable的线程,使其能够返回线程值,
    //call方法相当于带有返回值的run方法
    class TakWithResult implements Callable<String> {
        private int id;
        public  TakWithResult(int id) {
            // TODO Auto-generated constructor stub
            this.id = id;
        }
        @Override
        public String call() throws Exception {
            // TODO Auto-generated method stub
            return "result of TaskWhithr " + id;
        }
    }
    public static void main(String[] args) {
        // 创建一个缓冲线程池服务,输入参数则创建固定线程个数的线程池
        ExecutorService exec = Executors.newCachedThreadPool();
        List<Future<String>> results = new  ArrayList<Future<String>>();
        CachedThreadPool ca = new CachedThreadPool();
        for (int i = 0; i < 5; i++) {
            results.add(exec.submit(ca.new TakWithResult(i)));
            // 线程池服务启动线程
            final int j = i;
            exec.execute(new Runnable() {
                // 匿名内部类实现线程
                public void run() {
                    System.out.println("Thread " + j + " is running");
                }           
            });
            // 线程池服务停止
        }
        //通过call方法在线程外部获取线程返回值
        for(Future<String> fs : results) {
            try {
                System.out.println(fs.get());
            }catch (Exception e) {
                System.out.println(e);// TODO: handle exception
            }finally {
                exec.shutdown();
            }
        }
    }
}

5.线程休眠Thread.sleep(1000)

  1. 线程优先级
  1. 守护线程
public class SimpleDaemons implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            System.out.println("start daemons ");
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e) {
            // TODO: handle exception
            System.out.println("sleep() interrupted");
        }finally {
            System.out.println("finally go ");
        }
    }

    public static void main(String[] args) {
        Thread daemon = new Thread(new SimpleDaemons());
        //去除注释即可设置守护线程
        //daemon.setDaemon(true);
        daemon.start();
    }
}
  1. synchronized 线程同步

a. 方法同步

public synchronized void methodA(){
  syso(this);
}

-对方法加锁后,通对象的不同线程,在同一时刻,只能有一个线程能够调用methodA方法

b. 静态方法(类对象)同步

public synchronized static void methodA(){
  syso(this);
}

c. 对象同步代码块

public void methodC(){
synchronized(this){
syso(this);
}
}

d. 类同步代码块

public void methodD(){
  synchronized(className.class){
  syso(this);
}
}
注意: 线程的同步针对对象, 不论同步方法还是同步代码块,都是锁定的对象,而非代码块和方法本身,每一个对象只能有一个线程同步锁与之关联
  1. 线程锁
  1. volatile关键字

代码目测记事本手撸,小错误很多,都修正了下
原帖传送门

上一篇下一篇

猜你喜欢

热点阅读