用户工具

站点工具


分享:技术:java:某公司笔试题

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
分享:技术:java:某公司笔试题 [2018/04/12 13:55]
gxx 创建
分享:技术:java:某公司笔试题 [2019/04/30 10:41] (当前版本)
gxx
行 118: 行 118:
 ===== 并发编程 ===== ===== 并发编程 =====
 实现逻辑:n个线程并发,按顺序打印1,​2,​3...,​n,​n+1,​n+2,​...,​2n,​2n+1,​2n+2... 实现逻辑:n个线程并发,按顺序打印1,​2,​3...,​n,​n+1,​n+2,​...,​2n,​2n+1,​2n+2...
-==== PrintObject.java ​====+==== 解法1 ==== 
 +使用ReentrantLock condition await signalAll搞定 
 +=== PrintObject.java ===
 <code java PrintObject.java>​ <code java PrintObject.java>​
 package com.gxx.record.gtja;​ package com.gxx.record.gtja;​
行 193: 行 195:
 } }
 </​code>​ </​code>​
-==== MyThread.java ​====+=== MyThread.java ===
 <code java MyThread.java>​ <code java MyThread.java>​
 package com.gxx.record.gtja;​ package com.gxx.record.gtja;​
行 231: 行 233:
 } }
 </​code>​ </​code>​
-==== Main.java ​====+=== Main.java ===
 <code java Main.java>​ <code java Main.java>​
 package com.gxx.record.gtja;​ package com.gxx.record.gtja;​
行 281: 行 283:
 1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​ 1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​1,​2,​3,​4,​5,​
 </​code>​ </​code>​
 +==== 解法2 ====
 +使用wait notifyAll搞定
 +=== LockObject.java ===
 +<code java LockObject.java>​
 +package com.gxx.test;​
 +
 +/**
 + * 锁对象
 + */
 +public class LockObject {
 +    //计数
 +    int count;
 +}
 +</​code>​
 +=== MyThread.java ===
 +<code java MyThread.java>​
 +package com.gxx.test;​
 +
 +/**
 + * 线程
 + */
 +public class MyThread extends Thread {
 +    int index;//​索引
 +    LockObject lockObject;//​锁对象
 +    int threadCount;//​线程总数
 +
 +    /**
 +     * 构造方法
 +     * @param index
 +     * @param lockObject
 +     * @param threadCount
 +     */
 +    public MyThread(int index, LockObject lockObject, int threadCount) {
 +        this.index = index;
 +        this.lockObject = lockObject;
 +        this.threadCount = threadCount;​
 +    }
 +
 +    @Override
 +    public void run() {
 +        /**
 +         * 锁,只有一个线程进入
 +         */
 +        synchronized (lockObject) {
 +            while (true) {
 +                try {
 +                    if (lockObject.count % threadCount == index) {
 +                        System.out.println((lockObject.count+1) + ","​);​
 +                        Thread.sleep(100);​
 +                        lockObject.count ++;
 +                        /**
 +                         * 唤起wait的线程
 +                         */
 +                        lockObject.notifyAll();​
 +                    } else {
 +                        /**
 +                         * 释放锁
 +                         */
 +                        lockObject.wait();​
 +                    }
 +                } catch (Exception e) {
 +                    e.printStackTrace();​
 +                }
 +            }
 +
 +        }
 +    }
 +}
 +</​code>​
 +=== PrintThreadTest.java ===
 +<code java PrintThreadTest.java>​
 +package com.gxx.test;​
 +
 +/**
 + * 多线程打印测试
 + */
 +public class PrintThreadTest {
 +
 +    /**
 +     * main方法
 +     * @param args
 +     * @throws Exception
 +     */
 +    public static void main(String[] args) throws Exception {
 +        /**
 +         * 锁对象
 +         */
 +        LockObject lockObject = new LockObject();​
 +
 +        /**
 +         * 线程总数
 +         */
 +        int threadCount = 5;
 +        for(int i=0;​i<​threadCount;​i++) {
 +            /**
 +             * 构造线程
 +             */
 +            new MyThread(i, lockObject, threadCount).start();​
 +        }
 +
 +        /**
 +         * 主线程hold住
 +         */
 +        System.in.read();​
 +    }
 +}
 +</​code>​
 +=== 输出 ===
 +<​code>​
 +1,
 +2,
 +3,
 +4,
 +5,
 +6,
 +7,
 +8,
 +9,
 +10,
 +11,
 +12,
 +13,
 +14,
 +15,
 +16,
 +17,
 +18,
 +19,
 +...
 +</​code>​
 +
分享/技术/java/某公司笔试题.1523512515.txt.gz · 最后更改: 2018/04/12 13:55 由 gxx