zoukankan      html  css  js  c++  java
  • 【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

    本题并不难,实现方式有很多种,有很多种结构。

    方法一:利用内部类实现,两个实现加减的类实现Runnable接口,然后再实现4个具体线程。

    代码:

    public class ManyThreads {
    
        private int j;
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ManyThreads many = new ManyThreads();
            Inc inc = many.new Inc();
            Dec dec = many.new Dec();
            for (int i = 0; i < 2; i++) {
                Thread t = new Thread(inc);
                t.start();
                t = new Thread(dec);
                t.start();
            }
        }
    
        private synchronized void inc() {
            j++;
            System.out.println(Thread.currentThread().getName() + "inc" + j);
        }
    
        private synchronized void dec() {
            j--;
            System.out.println(Thread.currentThread().getName() + "dec" + j);
        }
    
        class Inc implements Runnable {
    
            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i < 20; i++) {
                    inc();
                }
            }
    
        }
    
        class Dec implements Runnable {
    
            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i < 20; i++) {
                    dec();
                }
            }
    
        }
    }

    第二种方式:具体加减操作写在一个类的方法里,没有内部类,用另外一个类去调用。

    代码:

    public class MyTest {
        private ManyThreads2 many = new ManyThreads2();
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            MyTest myTest = new MyTest();
            myTest.test();
        }
    
        public void test() {
            for (int i = 0; i < 2; i++) {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        for (int i = 0; i < 20; i++) {
                            many.inc();
                        }
                    }
    
                }).start();
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        for (int i = 0; i < 20; i++) {
                            many.dec();
                        }
                    }
    
                }).start();
            }
        }
        class ManyThreads2 {
            private int j = 0;
    
            public synchronized void inc() {
                j++;
                System.out.println(Thread.currentThread().getName() + "inc" + j);
            }
    
            public synchronized void dec() {
                j--;
                System.out.println(Thread.currentThread().getName() + "dec" + j);
            }
    
        }
    }

    参考资料:

    http://www.cnblogs.com/nannanITeye/p/3421943.html

    http://blog.csdn.net/u014236541/article/details/51178905

    http://aijuans.iteye.com/blog/1847835

  • 相关阅读:
    我的第一个B2C 网上图书商店,初始化
    JFreeChat学习圆饼状图的创建(结合serlvet,非原创)!
    JFreeChat学习柱状图的创建(X,Y轴的口口问题还未解决,固暂时使用拼音表示)
    JFreeChat学习柱状图关于 口口 的进一步解决方案
    JSON发送的工具类分享,应该还是蛮常用的!
    linux 常见命令
    mysql常用命令
    php 实现树状无限分类查询
    轻量级的mvc框架封装
    lamp 环境下,php7.0以上,配置重写rewrite,影藏index.php
  • 原文地址:https://www.cnblogs.com/guweiwei/p/6626450.html
Copyright © 2011-2022 走看看