并发

2016-08-15  本文已影响0人  tdeblog

1.Runable与Thread#

Thread类是实现了Runable接口。

class TestRun implements Runnable {

    private int i = 0;
    @Override
    public void run() {
        while(i < 100) {
            i ++;
            System.out.println("run");
            Thread.yield();
        }
    }
}

public class Client {
    public static void main(String args[]) {
        /*Context context = new Context();
        context.setState(Context.concreteState1);
        context.handler2();
        context.handler1();*/
        TestRun tr = new TestRun();
        tr.run();
        Thread t = new Thread(new TestRun());
        //设置为后台执行
        t.setDaemon(true);
        //与主线程并发执行
        t.start();
        
        System.out.println("main");
    }
}

2.Executors#

class TestRun implements Runnable {

    private int i = 0;
    private int n = 0;

    public TestRun(int n){
        this.n = n;
    }
    @Override
    public void run() {
        while(i < 100) {
            i ++;
            System.out.println("run" + n);
            Thread.yield();
        }
    }
}

public class Client {
    public static void main(String args[]) {
        //一个线程管理工具类
        //ExecutorService ex = Executors.newCachedThreadPool();
        //定义线程数量
        ExecutorService ex = Executors.newFixedThreadPool(3);
        for(int i = 0; i <= 5; i++) {
            ex.execute(new TestRun(i));
        }
        ex.shutdown();
    }
}

3.Callable#

Callable接口可以处理具有返回值的线程。只能通过ExecutorService.submit()函数启动

class TestCall implements Callable<String> {

    private StringBuilder sb = new StringBuilder("Callable");
    private int id;

    public TestCall(int id) {
        this.id = id;
    }

    @Override
    public String call() throws Exception {
        sb.append(id);
        return sb.toString();
    }
}

public class Client {
    public static void main(String args[]) {
        ExecutorService ex = Executors.newCachedThreadPool();
        ArrayList<Future<String>> results = new ArrayList<Future<String>>();
        for(int i = 0; i <= 1000; i++) {
            results.add(ex.submit(new TestCall(i)));
        }

        for(Future<String> fs : results) {
            try {
                System.out.println(fs.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } finally {
                ex.shutdown();
            }
        }
    }
}

4.共享资源#

//一个加锁对象中某个加锁方法被访问,则整个对象被加锁
synchronized void f() {}
synchronized void g() {}
//整个类被加锁
synchronized static void t() {}

//显示加锁
lock.lock()
lock.unlock()
``
上一篇下一篇

猜你喜欢

热点阅读