`
jsjzhou
  • 浏览: 28549 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

一道java多线程笔试上机题

阅读更多

   上个星期我到诚迈科技参加面试.面试完毕后面试官让我把笔试卷上的一道多线程题在计算机上编程实现.题目如下:

四个线程a,b,c,d. 线程a,b对变量i加一. 线程c,d对变量i减去一.四个线程顺序执行, 每个线程每次只执行一次.i的初始值为0, 打印结果0 1 2 1 0 1 2 1 0 1 2...

   这道题还是有一定的难度的. 因为要求顺序执行. 不能简单用同步.

   经考虑,我决定用一个队列来对四个线程顺序调度.代码如下:

package org.jenfer.struts2demo.web.struts2.action;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 四个线程a,b,c,d. 线程a,b对变量i加一.
 * 线程c,d对变量i减去一.四个线程顺序执行,
 * 每个线程每次只执行一次.i的初始值为0,
 * 打印结果0 1 2 1 0 1 2 1 0 1 2... 
 * 
 * @author 武汉科技大学08级研究生周剑华
 *
 */
public class MultiThreadTest {
	//variable i 
	private int i=0;
	//queue to control thread invoke
	private BlockingQueue<Integer> queue=new LinkedBlockingQueue<Integer>();
	
	public MultiThreadTest() {
		queue.offer(1);
		queue.offer(2);
		queue.offer(3);
		queue.offer(4);
	}
	
	public synchronized void inc(int con) throws InterruptedException{
		while(true){
			int c=queue.peek();
			if(c==con){
				break;
			}else{
				notifyAll();
				wait();
			}
		}
		
		queue.offer(queue.take());
		
		i++;
		System.out.println(Thread.currentThread().getName()+",i="+i);
	}
	
	public synchronized void dec(int con) throws InterruptedException{
		while(true){
			int c=queue.peek();
			if(c==con){
				break;
			}else{
				notifyAll();
				wait();
			}
		}
		
		queue.offer(queue.take());
		i--;
		System.out.println(Thread.currentThread().getName()+",i="+i);
	}
	
	private class IncThread implements Runnable{
		private int condition;
		public IncThread(int condition) {
			this.condition=condition;
		}
		public void run() {
			while(true){
				try {
					inc(condition);
				} catch (InterruptedException e) {
					System.err.println(Thread.currentThread().getName()+" exit now");
					break;
				}
			}
		}
	}
	
	private class DecThread implements Runnable{
		private int condition;
		public DecThread(int condition) {
			this.condition=condition;
		}
		public void run() {
			while(true){
				try {
					dec(condition);
				} catch (InterruptedException e) {
					System.err.println(Thread.currentThread().getName()+" exit now");
					break;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		MultiThreadTest test=new MultiThreadTest();
		ExecutorService exec=Executors.newFixedThreadPool(4);
		exec.submit(test.new IncThread(1));
		exec.submit(test.new IncThread(2));
		exec.submit(test.new DecThread(3));
		exec.submit(test.new DecThread(4));
		
		exec.shutdown();
	}
}

 

分享到:
评论
9 楼 leoricxu 2014-06-25  
package com.thread.test;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
*  重新用队列写了下
* @author Administrator
*
*/
public class Task4Test2 {
public Task4Test2() {
print();
}

public static void main(String[] args) throws InterruptedException {
final Task4Test2 test = new Task4Test2();
test.queue1.put("start");

Thread a = new Thread(new Runnable() {
public void run() {
while (true) {
try {
test.queue1.take();
test.increment();
test.queue2.put("a");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "a");

Thread b = new Thread(new Runnable() {
public void run() {
while(true){
try {
test.queue2.take();
test.increment();
test.queue3.put("b");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "b");

Thread c = new Thread(new Runnable() {
public void run() {
while(true){
try {
test.queue3.take();
test.decrement();
test.queue4.put("c");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "c");

Thread d = new Thread(new Runnable() {
public void run() {
while(true){
try {
test.queue4.take();
test.decrement();
test.queue1.put("d");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}, "d");
a.start();
b.start();
c.start();
d.start();
}

public void decrement() {
index--;
print();
}

public void increment() {
index++;
print();
}

public void print() {
System.out.println(Thread.currentThread().getName() +" "+index);
}

private int index;
private BlockingQueue<String> queue1 = new LinkedBlockingQueue<String>(1);
private BlockingQueue<String> queue2 = new LinkedBlockingQueue<String>(1);
private BlockingQueue<String> queue3 = new LinkedBlockingQueue<String>(1);
private BlockingQueue<String> queue4 = new LinkedBlockingQueue<String>(1);
}
8 楼 leoricxu 2014-06-25  
最近在学习多线程。
package com.thread.test;

import java.util.concurrent.Semaphore;

public class Task4Test {
private static Semaphore semp = new Semaphore(1);

public static void main(String args[]) throws InterruptedException {
final Task4Test number = new Task4Test();
while(true){
Thread a = new Thread(new Runnable() {
public void run() {
number.increment();


}
},"a");

Thread b = new Thread(new Runnable() {
public void run() {

number.increment();

}
},"b");

Thread c = new Thread(new Runnable() {
public void run() {
number.minus();

}
},"c");

Thread d = new Thread(new Runnable() {
public void run() {

number.minus();

}
},"d");
a.start();
a.join();
b.start();
b.join();
c.start();
c.join();
d.start();
d.join();


}
}

public synchronized void minus() {
try {
semp.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (index > 0) {
--index;
print();
semp.release();
} else {
semp.release();
}

}

public synchronized void increment() {
try {
semp.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (index < 2) {
++index;
print();
semp.release();
} else {
semp.release();
}

}

public Task4Test() {
System.out.println(index);
}

public void print() {
System.out.println(Thread.currentThread().getName()+"   "+index);
}

private int index = 0;
}
7 楼 funnyone 2013-10-17  
	private static volatile int target=0;
	private static volatile int count=0;
	private static final Object LOCk=new Object();
	
	public static void main(String[] args) throws Exception {
		for(char i='a';i<='d';i=(char)(i+1)){
			final char temp=i;
			new Thread(new Runnable() {
				public void run() {
					while(true){
						if (count%4==(int)temp-(int)'a') {
							synchronized (LOCk) {
								if (count%4==(int)temp-(int)'a') {
									++count;
									if (temp=='a'||temp=='b') {
										++target;
									}else {
										--target;
									}
								}
								System.err.println(temp+":"+target);
							}
						}
					}
				}
			}).start();
		}
	}
6 楼 yan465942872 2011-08-30  
自己写的。。

public class Test {  
	public static void main(String[] args) {
		
		final ShareData shareData = new ShareData();

		new Thread(new Runnable() {
			@Override
			public void run() {
				while(true) {
					shareData.increase(0);
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(true) {
					shareData.increase(1);
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(true) {
					shareData.decrease(2);
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(true) {
					shareData.decrease(3);
				}
			}
		}).start();
		
	}
} 

class ShareData {
	
	int i = 0;
	int j = 0;
	
	public synchronized void increase(int threadIndex) {
		
		while(j != threadIndex) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("Thread " + j + ": i = " + i);
		i++;
		j = (j + 1) % 4;
		notifyAll();
	}
	
	public synchronized void decrease(int threadIndex) {
		while(j != threadIndex) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("Thread " + j + ": i = " + i);
		i--;
		j = (j + 1) % 4;
		notifyAll();
	}
	
}
5 楼 jsjzhou 2011-06-05  
另外我提供一个简单的方法:
/**
*
* @author 武汉科技大学 周剑华
*
*/
public class ThreadTest {
private static final int THREAD_NUM = 4;
private int invoder = 0;
private int i = 0;

public synchronized void add(final int threadIndex) throws Exception {
while (threadIndex != invoder) {
wait();
}
invoder = (invoder + 1) % THREAD_NUM;
System.out.println("Thread " + threadIndex + ": i=" + i);
i++;
notifyAll();
}

public synchronized void sub(final int threadIndex) throws Exception {
while (threadIndex != invoder) {
wait();
}
invoder = (invoder + 1) % THREAD_NUM;
System.out.println("Thread " + threadIndex + ": i=" + i);
i--;
notifyAll();
}

private class Inc extends Thread {
private final int index;

public Inc(int index) {
this.index = index;
}

@Override
public void run() {
try {
while (true) {
add(index);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

private class Dec extends Thread {
private final int index;

public Dec(int index) {
this.index = index;
}

@Override
public void run() {
try {
while (true) {
sub(index);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
ThreadTest test = new ThreadTest();
test.new Inc(0).start();
test.new Inc(1).start();
test.new Dec(2).start();
test.new Dec(3).start();
}
}
4 楼 jsjzhou 2010-11-15  
shengren0 写道
楼主的代码运行结果跟预期不一致

在你的环境运行结果是什么啊?请赐教。
3 楼 shengren0 2010-10-30  
楼主的代码运行结果跟预期不一致
2 楼 ws715 2010-08-03  
楼下的程序也只能叫单线程吧
1 楼 253317239 2010-07-20  
/**
*  @作者: cz
*  2010-7-20  下午02:03:51
*  TODO:四个线程a,b,c,d. 线程a,b对变量i加一. 线程c,d对变量i减去一.
*  四个线程顺序执行, 每个线程每次只执行一次.i的初始值为0,
*   打印结果0 1 2 1 0 1 2 1 0 1 2...
*/

public class MutilThreadTest implements Runnable{
   static int i=0;
     public static void runThreadA(){
i++;
System.out.print(i);
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
   }
     public static void runThreadB(){
i--;
System.out.print(i);
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
    }
 
/**
* @param args
*/
public static void main(String[] args) {
System.out.print(0);
try{
while(true){
       new Thread(new MutilThreadTest()).start();
       Thread.sleep(400);
}
}catch(Exception e){
e.printStackTrace();
}
}

/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
try{
new MutilThreadTest().runThreadA();
new MutilThreadTest().runThreadA();
new MutilThreadTest().runThreadB();
new MutilThreadTest().runThreadB();
}catch(Exception e){
e.printStackTrace();
}

}
}

相关推荐

    上海交通银行 Java面试题(上机考)

    4. **多线程**:Java提供了丰富的多线程支持,面试中可能会涉及线程的创建、同步机制(如synchronized关键字、Lock接口、信号量等),以及并发工具类如ExecutorService、CountDownLatch、CyclicBarrier等。...

    java笔试及上机

    最后,`java上机题.doc`可能涉及实际编程题,可能涵盖以下内容: 1. **程序编写**:根据题目要求,编写符合功能的Java程序,可能涉及到文件操作、网络编程、数据库连接等。 2. **算法实现**:查找、排序算法,如...

    JAVA上机考试题

    总的来说,"JAVA上机考试题"将涵盖Java语言的各个方面,从基础到高级,包括但不限于语法、面向对象编程、异常处理、集合框架、IO/NIO、多线程、API应用和算法实现。通过这些题目,考生可以全面检验自己的Java编程...

    JAVA笔试面试资料JDBC HTTP、JSP、Servlet、Struts面试题汇总资料.zip

    Java基础、Java集合、多线程、JDBC、HTTP、JSP、Servlet、Struts面试题汇总(附答案).docx java工程师面试题大全-100%公司笔试题你都能碰到几个.docx Java开发工程师上机笔试题.docx Java开发求职面试题.docx Java...

    Java面试笔记 225道Java面试题JAVA面试基础知识点总结Java数据结构题笔试WORD资料汇总(19个).zip

    Java基础、Java集合、多线程、JDBC、HTTP、JSP、Servlet、Struts面试题汇总(附答案).docx java工程师面试题大全-100%公司笔试题你都能碰到几个.docx Java开发工程师上机笔试题.docx Java开发求职面试题.docx Java...

    华为笔试上机题答案苏州和南京地区

    "华为笔试上机题答案苏州和南京地区"这个标题表明这是一份针对华为公司在苏州和南京两地招聘笔试中上机题目的解答集。华为是全球知名的电信设备和消费电子制造商,其笔试题目通常涵盖计算机科学、信息技术、软件开发...

    蚂蚁金服上机试题.docx

    综合以上试题,我们可以看出,蚂蚁金服的上机试题全面考察了应聘者的多个能力维度,包括算法、数据结构、多线程、锁、异常设计、文本字符处理、逻辑思维、编程基础、代码风格以及网络地址知识。通过这些试题,蚂蚁金...

    Java南开上机题(全)

    Java南开上机题是针对Java编程语言设计的一系列实践性考试题目,旨在检验学习者对Java语言的理解和应用能力。这些题目通常涵盖基础语法、数据结构、算法、面向对象编程等多个方面,对于提升Java编程技能和准备相关...

    java中国各大公司面试笔试上机汇总大合集(上)

    本合集涵盖了中国各大公司针对Java开发者进行面试和笔试时的常见问题及上机实践题目,旨在帮助求职者全面了解并准备Java相关的技术面试。以下将详细解析这些文档可能涉及的Java知识点: 1. **基础语法**:Java的...

    史长最全的java涉及各方面的笔试,测试,上机题

    绝对超值的java全类型的面试题,包含JAVA应用的各个方面,包含各个知名公司的最新的java类面试题,只要你全部背熟,就可以去应聘任何公司的任何java类职务,请各公司自动回避。 对付java “应试”面试的最好武器,希望...

    童程童美2020Python笔试题A卷.doc

    3. 多线程、多进程:多线程是指在一个进程中执行多个线程,从而提高执行效率。多进程是指在一个进程中执行多个进程,从而提高执行效率。 4. join() 和 split() 函数:Python 的 `join` 函数可以将多个字符串连接成...

    新希望六和 面试题 高级JAVA开发工程师

    【描述】"新希望六和 面试题 信息部规划与研发上机试题-高级JAVA开发工程师"指出这是一套具体的上机测试题目,这意味着除了理论知识,面试者还需要具备实际编码能力。上机试题可能包括编写代码片段、调试现有代码、...

    华为常见的笔试题实现

    7. **多线程**:Java的并发编程是面试中的常见考点,你需要熟悉Thread类、Runnable接口、synchronized关键字、volatile关键字,以及ExecutorService和Future接口等。 8. **设计模式**:单例、工厂、观察者、装饰器...

    蚂蚁金服上机题目和答案.zip

    对于Java开发者而言,面试中常见的问题可能包括:Java基础语法、集合框架、多线程、异常处理、IO流、反射机制、设计模式、JVM内存模型、垃圾回收机制等。 接下来,我们聚焦到“JAVA”这个标签。Java作为广泛使用的...

    北大青鸟Java练习题

    练习题的类型多样,覆盖了Java编程的多个重要方面,如基础语法、面向对象编程、数据结构、算法、异常处理、多线程、集合框架、IO流、网络编程等。这些内容不仅是Java学习的核心,也是企业对求职者技术能力的基本要求...

    北大青鸟2年笔试题

    7. **多线程编程**:Java提供了丰富的线程API,包括Thread类、Runnable接口、同步机制(synchronized关键字、wait()、notify()等)和并发工具类(如ExecutorService、Semaphore等)。考生需要了解多线程的基本概念和...

    华为专业能力笔试面试高频知识点和题库.rar

    7. **网络编程**:TCP/IP协议、套接字编程、多线程/多进程通信。 8. **编程语言基础**:C/C++/Java/Python等语言的基本语法、异常处理、内存管理等。 二、上机笔试题与解答 “华为2016校园招聘上机笔试题及答案.zip...

    ACCP5.0 Y2考试(含笔试和上机)20090111

    1. **Java编程**:熟悉Java语法,理解面向对象编程概念,如封装、继承、多态,以及异常处理、线程同步等高级特性。 2. **数据库管理**:学习SQL语言,包括查询、插入、更新和删除数据,理解数据库设计原则,如ER模型...

    ACCP5.0 Y2考试(含笔试和上机)20090621

    1. **编程实战**:根据给定的问题描述编写程序,可能涉及到上述编程语言的高级特性,如面向对象编程、异常处理、多线程编程等。 2. **调试与优化**:检查和修复代码错误,理解运行时错误,并进行性能优化。 3. **...

    y2结业机试题

    "y2"代表学习阶段,"java"是编程语言,"结业"表示这是学业结束时的考核,"机试题"则说明是需要在计算机上进行的实际操作题目,可能涵盖类设计、异常处理、数据结构、IO流、多线程、集合框架、数据库操作等Java核心...

Global site tag (gtag.js) - Google Analytics