Java多线程1

来源:互联网 发布:怎么下载视频软件 编辑:程序博客网 时间:2024/05/18 03:12


最近在学习Java的多线程,以下为Java多线程的常见题目:

子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序

关于线程的相关知识可参考http://blog.csdn.net/vking_wang/article/details/9952063以及JDK文档。

接下来将会通过Java 5之前的Synchronized机制和Java 5之后的java.lang.concurrent.locks线程库来实现。


Synchronized方式实现:

public class Pratice1 {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubThread main = new ThreadOperator.MainThreadOperator();Thread sub = new ThreadOperator.SubThreadOperator();main.start();sub.start();main.join();sub.join();}}class ThreadOperator {//主线程和子线程通信的标志位,判断决定当前哪个线程运行,另外一个进入休眠。private static boolean isMain;//主线程和子线程交替执行的大循环次数private static final int LOOP_COUNT = 50;/** * 此处主线程和子线程封装在ThreadOperator类当中,两线程需要互斥, * 此处使用外部类的class对象作为唯一的锁。 */private static final Object lock = ThreadOperator.class;//作为内部类的主线程的线程类,考虑方便,此处使用继承Threadstatic class MainThreadOperator extends Thread {//主线程自己循环的次数private final int LOOP_OF_MAIN = 10;@Overridepublic void run() {for (int i = 1; i <= LOOP_COUNT; i++) {/** * 在大循环中,主线程和子线程需要实现互斥,此处使用synchronized{}语句块, * 使用ThreadOperator.class作为锁。 */synchronized (lock) {/* * 不管哪个线程首先抢占到执行权,都需要判断决定哪个进程继续执行,或进入等待。 *  */while (!isMain) {try {lock.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//在执行主线程的逻辑,打印内容for (int j = 0; j < LOOP_OF_MAIN; j++) {System.out.println("===> MainThreadOperator : " + Thread.currentThread() + " : " + j + " for loop " + i);}/** * 执行完准备退出synchronized{}语句块时, * 重置isMain标志位,并且唤醒等待的子线程。 */isMain = !isMain;lock.notify();}}}}/** * 分析同主线程一样 * */static class SubThreadOperator extends Thread {private final int LOOP_OF_SUB = 5;@Overridepublic void run() {for (int i = 1; i <= LOOP_COUNT; i++) {synchronized (ThreadOperator.class) {while (isMain) {try {lock.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (int j = 0; j < LOOP_OF_SUB; j++) {System.out.println("---> SubThreadOperator : " + Thread.currentThread() + " : " + j + " for loop " + i);}isMain = !isMain;lock.notify();}}}}}


运行结果:

---> SubThreadOperator : Thread[Thread-1,5,main] : 0 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 1 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 2 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 3 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 4 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 0 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 1 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 2 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 3 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 4 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 5 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 6 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 7 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 8 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 9 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 0 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 1 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 2 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 3 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 4 for loop 2
===> MainThreadOperator : Thread[Thread-0,5,main] : 0 for loop 2
===> MainThreadOperator : Thread[Thread-0,5,main] : 1 for loop 2

。。。。。。。。。。。。。。。


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 分割线 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Concurrent方式实现:

class ThreadOperator {//主线程和子线程通信的标志位,判断决定当前哪个线程运行,另外一个进入休眠。private static boolean isMain;//主线程和子线程交替执行的大循环次数private static final int LOOP_COUNT = 50;//private static final Object lock = ThreadOperator.class;/* * 此处通过Lock,以及Condition来实现线程间的通信: * Lock用于互斥,使用Condition的await(),signal()方法用于等待释放锁以及唤醒等待的线程, * 作用和synchronized语句块内的wait(),notify()作用类似。 * */private static final Lock lock = new ReentrantLock();private static final Condition condition = lock.newCondition();public static boolean isMain() {return isMain;}public static void setMain(boolean isMain) {ThreadOperator.isMain = isMain;}//作为内部类的主线程的线程类,考虑方便,此处使用继承Threadstatic class MainThreadOperator extends Thread {//主线程自己循环的次数private final int LOOP_OF_MAIN = 10;@Overridepublic void run() {for (int i = 1; i <= LOOP_COUNT; i++) {//获取锁lock,lock.lock();/** * 使用try{}finally{}语句块保证最后会释放锁资源,否则如果try{}中发生异常,锁就无法释放,造成死锁 */try {while (!isMain) {try {//此处进入等待,释放lockcondition.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (int j = 0; j < LOOP_OF_MAIN; j++) {System.out.println("===> MainThreadOperator : " + Thread.currentThread() + " : " + j + " for loop " + i);}//执行完当前轮数后改变标志位并且唤醒等待的线程isMain = !isMain;condition.signal();} finally {//最后释放锁lock.unlock();}}}}/** * 分析同主线程一样 * */static class SubThreadOperator extends Thread {private final int LOOP_OF_SUB = 5;@Overridepublic void run() {for (int i = 1; i <= LOOP_COUNT; i++) {lock.lock();try {while (isMain) {try {condition.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (int j = 0; j < LOOP_OF_SUB; j++) {System.out.println("---> SubThreadOperator : " + Thread.currentThread() + " : " + j + " for loop " + i);}isMain = !isMain;condition.signal();} finally {lock.unlock();}}}}}
运行结果:

---> SubThreadOperator : Thread[Thread-1,5,main] : 0 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 1 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 2 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 3 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 4 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 0 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 1 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 2 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 3 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 4 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 5 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 6 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 7 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 8 for loop 1
===> MainThreadOperator : Thread[Thread-0,5,main] : 9 for loop 1
---> SubThreadOperator : Thread[Thread-1,5,main] : 0 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 1 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 2 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 3 for loop 2
---> SubThreadOperator : Thread[Thread-1,5,main] : 4 for loop 2
===> MainThreadOperator : Thread[Thread-0,5,main] : 0 for loop 2
===> MainThreadOperator : Thread[Thread-0,5,main] : 1 for loop 2
===> MainThreadOperator : Thread[Thread-0,5,main] : 2 for loop 2
===> MainThreadOperator : Thread[Thread-0,5,main] : 3 for loop 2

。。。。。。。。。。。。

0 0
原创粉丝点击