Java多线程与并发库高级应用 学习笔记 1-9课

来源XXX,免得打广告嫌疑。

http://www.cnblogs.com/whgw/archive/2011/10/03/2198506.html

今天看了文章才发现创建线程最佳方式为实现Runnable接口,之前的习惯要改鲁。

http://blog.csdn.net/imzoer/article/details/8500670

Java中Timer的用法

package timer;

import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {
    static Timer timer = new Timer();

    public static void main(String[] args) {

        // task task to be scheduled.
        // delay delay in milliseconds before task is to be executed.
        // period time in milliseconds between successive task executions.
        timer.schedule(new MyTimerTask(), 2000);
    }

}
/*
 * 执行间隔2秒与4秒交替进行
 */
class MyTimerTask extends TimerTask {
    static boolean change = true;
    Calendar calendar = Calendar.getInstance();

    @Override
    public void run() {
        change = !change;
        System.out.println(calendar.getTime());
        new Timer().schedule(new MyTimerTask(), change ? 2000 : 4000);
    }

}

线程安全的在于多线程对同一资源对象的读、写、事务完成阶段。

http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html

java synchronized关键字详解

弄明白synchronized这个关键字在不同情况锁住的对象粒度,以及范围。

package Thread;

/**
 * 子线程2次,主线程4次交替循环10次。
 *
 */
public class AlternateLoop {
    static Sysout sysout = new Sysout();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            sysout.subBusiness(i);
            sysout.mainBusiness(i);
        }
    }

}

// class MyThread implements Runnable {
// @Override
// public void run() {
// AlternateLoop.sysout.subBusiness(1);
// }
// }
//
// class MyThread2 implements Runnable {
//
// @Override
// public void run() {
// AlternateLoop.sysout.mainBusiness(i);
// }
// }

/*
 * 同一资源管理业务逻辑
 */
class Sysout {
    private boolean isSub = true;

    public synchronized void mainBusiness(int i) {
        while (isSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int j = 0; j < 4; j++) {
            System.out.println("mainBusiness" +j+"loop of"+ i);
        }
        isSub = true;
        this.notify();
    }

    public synchronized void subBusiness(int i) {
        while (!isSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int j = 0; j < 2; j++) {
            System.out.println("subBusiness" +j+"loop of"+ i);
        }

        isSub = false;
        this.notify();
    }
}

Java并发编程:深入剖析ThreadLocal

每个线程存在对应的线程副本对象。

package Thread;

import java.util.Random;

public class ThreadLocalTest {

    public static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int data=new Random().nextInt();
                    System.out.println(Thread.currentThread().getName()+"has put data :"+data);
                    threadLocal.set(data);
                    new A().get();
                    new B().get();
                }
            }).start();
        }

    }
    static class A {
        public void get() {
            int data=threadLocal.get();
            System.out.println("A from Thread" + Thread.currentThread().getName() + ""
                        + data);
        }
    }

    static class B {
        public void get() {
            int data=threadLocal.get();
            System.out.println("B from Thread" + Thread.currentThread().getName() + ""
                        + data);
        }
    }
}

上面的例子需要改造一下 这种内部静态类用起来不科学啊。

java线程:Atomic(原子的)  jdk 1.5的新特性

Java并发编程:线程池的使用

package Thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {

    public static void main(String[] args) {
        ExecutorService threadPool =Executors.newCachedThreadPool();
//        ExecutorService threadPool =Executors.newFixedThreadPool(10);
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 10; i++) {
            final int task = 1;
            threadPool.execute(new Runnable() {

                @Override
                public void run() {
                    for (int j = 0; j < 10; j++) {
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()
                                + "is looping of " + j + "for task of" + task);
                    }
                }
            });
        }

        Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("bombing!");
            }
        }, 6, 2, TimeUnit.SECONDS);

    }
}
时间: 2024-10-23 08:29:04

Java多线程与并发库高级应用 学习笔记 1-9课的相关文章

Java多线程与并发库高级应用 学习笔记 10-16课

Callable与Future的介绍 package Thread; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; im

Java多线程与并发库高级应用 学习笔记 16-22课 +面试题

java.util.concurrent.Exchanger应用范例与原理浅析--转载 package Thread; import java.util.Random; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExchangerTest { public static

Java多线程与并发库高级应用之公共屏障点CyclicBarrier

一个小队去登山,每位队员登山的速度不同.山上有几个集合点,在每一集合点处,先到达的队员只有等后面的队员全部到达集合点后才能继续向下一个集合点出发. JDK1.5提供的CyclicBarrier模拟了这种情况.每一个线程相当于一个登山队员,CyclicBarrier相当于山上的集合点.只有等所有线程都执行到了CyclicBarrier后才可以继续向下执行. CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程

Java多线程与并发库高级应用之信号量Semaphore

JDK1.5提供了一个计数信号量Semaphore类.Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,并提供了同步机制. Semaphore提供了两个构造器来创建对象: 1)Semaphore(int permits):创建具有给定的许可数和非公平的公平设置的Semaphore. 2)Semaphore(int permits, boolean fair):创建具有给定的许可数和给定的公平设置的Semaphore.如果此信号量保证在争用时按先进先出的顺序授予许可,则为

Java多线程与并发库高级应用之阻塞队列BlockingQueue

JDK1.5提供了阻塞队列接口BlockingQueue,它是一个有界阻塞队列.BlockingQueue实现是线程安全的,可以安全地与多个生产者和多个使用者一起使用. 使用时用其实现类 ArrayBlockingQueue,它一个由数组支持的有界阻塞队列.此队列按 FIFO(先进先出)原则对元素进行排序.队列的头部 是在队列中存在时间最长的元素.队列的尾部是在队列中存在时间最短的元素.新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素. 这是一个典型的"有界缓存区",固定

Java多线程与并发库高级应用之线程数据交换Exchanger

JDK1.5提供了Exchanger用于两个线程的数据交换.两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据. Exchanger只提供了一个构造器: Exchanger():创建一个新的Exchanger. Exchanger中也只有两个方法: V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象. V exchange(V x, long timeout,

Java多线程与并发库高级应用之倒计时计数器

CountDownLatch 类是一个倒计时计数器,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.由于调用了countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回. CountDownLatch 是一个通用同步工具,它有很多用途.将计数1初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 c

Java多线程与并发库高级应用-java5线程并发库

java5 中的线程并发库 主要在java.util.concurrent包中 还有 java.util.concurrent.atomic子包和java.util.concurrent.lock子包

Java多线程与并发库高级应用

1.传统线程机制的回顾 1.1创建线程的两种传统方式 在Thread子类覆盖的run方法中编写运行代码 // 1.使用子类,把代码放到子类的run()中运行 Thread thread = new Thread() { @Override public void run() { while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.p