【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
【Java面试题】29 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。的更多相关文章
- 【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次 思路如下: 子线程语主线程为互斥,可用SYNCHRONIZED.很容易想 ...
- 设计四个线程,其中两个线程每次对j增加1,另外两个线程对j每次减1,写出程序
/* * 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序. */ public class ThreadTest { private int j; public sta ...
- 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1。循环100次,写出程序。
package cn.usst.DataTest6; /** * 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1.循环100次,写出程序. * @ * */ public cl ...
- 设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 。写出程序。
题目:设计 4 个线程,其中两个线程每次对 j 增加 1 ,另外两个线程对 j 每次减少 1 .写出程序. 代码实现 public class ThreadTest{ private int j; c ...
- 设计 4 个线程,其中两个线程每次对 j 增加 1,另外两个线程对 j 每次减少 1。写出程序。
先设计一个类处理加减这一行为: public class ManyThread { private int j = 0; public synchronized void inc(){ j++; Sy ...
- Java面试题集(二)
51.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,写出程序. 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题. public class ThreadTest1 ...
- java面试题及答案(转载)
JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...
- java 考试试题
Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他.有些题来自网上搜集整理,有些题来自学员 ...
- java面试题小全
面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的 ...
随机推荐
- 安装ELK
1. 安装Elasticsearch a. 下载 : https://download.elasticsearch.org/elasticsearch/release/org/elasticsearc ...
- How to set JAVA environment variables in Linux or CentOS
How to set JAVA environment variables JAVA_HOME and PATH in Linux After installing new java (jdk or ...
- MYSQLDUMP参数详解(转)
mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器).转储包含创建表和/或装载表的SQL语句. 如果你在服务器上进行备份,并且表 ...
- oracle递归层级查询 start with connect by prior
递归层级查询:start with connect by prior 以部门表作为解析 表结构:dept{id:'主键',name:'部门名称',parent_id:'父亲id'} select * ...
- qsort函数以及sort函数使用方法
sort函数的使用方法 做ACM题的时候,排序是一种常常要用到的操作. 假设每次都自己写个冒泡之类的O(n^2)排序,不但程序easy超时,并且浪费宝贵的比赛时间,还非常有可能写错. STL里面 ...
- apache2部署django的错误
apache的日志例如以下报错: /var/www/my_project/myproject/wsgi.py cannot be loaded as Python module ImportError ...
- Java多线程和并发基础
第一:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运 ...
- 工作流模式 (zhuan)
http://www.cnblogs.com/soundcode/archive/2010/12/30/1922283.html *********************************** ...
- JSON数据乱码问题
http://ifeve.com/json-code-problem/ ***************************** 背景 程序员一提到编码应该都不陌生,像gbk.utf-8.ascii ...
- java jsp失效问题--待解决
打印jps错误信息jps -J-Djps.debug=true -J-Djps.printStackTrace=true 未完待续...