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

方法一:利用内部类实现,两个实现加减的类实现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

【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。的更多相关文章

  1. 【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。

    题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...

  2. 设计四个线程,其中两个线程每次对j增加1,另外两个线程对j每次减1,写出程序

    /* * 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序. */ public class ThreadTest { private int j; public sta ...

  3. 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1。循环100次,写出程序。

    package cn.usst.DataTest6; /** * 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1.循环100次,写出程序. * @ * */ public cl ...

  4. 设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 。写出程序。

    题目:设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 .写出程序. 代码实现 public class ThreadTest{ private int j; c ...

  5. 设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写出程序。

    先设计一个类处理加减这一行为: public class ManyThread { private int j = 0; public synchronized void inc(){ j++; Sy ...

  6. Java面试题集(二)

    51.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,写出程序.  以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题. public class ThreadTest1 ...

  7. java面试题及答案(转载)

    JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...

  8. java 考试试题

    Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他.有些题来自网上搜集整理,有些题来自学员 ...

  9. java面试题小全

    面向对象的特征有哪些方面   1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的 ...

随机推荐

  1. 国外程序员整理的Java资源大全

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  2. js中push和join方法使用介绍

    push和join方法想必大家并不陌生吧,在本文将为大家详细介绍下js中的push和join方法的使用.代码: <script type="text/javascript"& ...

  3. 《Android源代码设计模式解析与实战》读书笔记(二十)

    第二十章.适配器模式 适配器模式是结构型设计模式之中的一个,它在我们的开发中使用率极高,比方ListView.GridView以及RecyclerView都须要使用Adapter. 1.定义 适配器模 ...

  4. rpm -e 包名 卸载安装的二进制包

    rpm -e --nodeps nc-.el6.x86_64 #--nodeps 不包含依赖包,直接删除rpm包

  5. Mongodb查询引用

    var result = db.users.findOne({"name":"Tom Wu"},{"address_ids":1,_id:0 ...

  6. db papers

    http://www.redbook.io/ http://db.cs.berkeley.edu/papers/ https://github.com/rxin/db-readings http:// ...

  7. 配置Tomcat的server.xml以适应web-content文件系统的位置改变

    刚才把写的一对jsp.html文件夹改变了位置,然后测试的时候出现了404 后来思考,应该去重新配置tomcat的server.xml文件,修改虚拟路径对应的文件系统路径,修改为当前对应的文件系统路径 ...

  8. python 将txt内容写入excel

    #!/usr/bin/env python # -*- coding: utf-8 -* import os import xlrd import xlwt import datetime impor ...

  9. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...

  10. Google Guava 库用法整理<转>

    参考: http://codemunchies.com/2009/10/beautiful-code-with-google-collections-guava-and-static-imports- ...