论坛首页 招聘求职论坛

遇到上机考试了,悲催的。

浏览 15510 次
精华帖 (0) :: 良好帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-03-13  
北京-湖南人 写道
pengmj 写道
package org.python.test;

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

/**
 *
 * @author pengmj
 * @since 2012-3-13
 */
public class ThreadTest {
	public volatile static int i = 0;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ThreadTest tt = new ThreadTest();
		tt.run();
	}
	public void run(){
		BlockingQueue<Object> queue1 = new LinkedBlockingQueue<Object>();
		BlockingQueue<Object> queue2 = new LinkedBlockingQueue<Object>();
		queue1.add(new Object());
		new Tadd(queue1,queue2,1000).start();
		new Tprint(queue1,queue2,1000).start();
	}
	public class Tadd extends Thread{
		int count = 0;
		BlockingQueue<Object> queue1;
		BlockingQueue<Object> queue2;
		public Tadd(BlockingQueue<Object> queue1,BlockingQueue<Object> queue2,int count){
			this.queue1 = queue1;
			this.queue2 = queue2;
			this.count = count;
		}
		public void run(){
			try{
				for(int j=1;j<=count;j++){
					queue1.take();
					i++;
					queue2.add(new Object());
				}
			}
			catch(Exception e){}
		}
	}
	public class Tprint extends Thread{
		int count = 0;
		BlockingQueue<Object> queue1;
		BlockingQueue<Object> queue2;
		public Tprint(BlockingQueue<Object> queue1,BlockingQueue<Object> queue2,int count){
			this.queue1 = queue1;
			this.queue2 = queue2;
			this.count = count;
		}
		public void run(){
			try{
				while(count>0){
					queue2.take();
					System.out.println(i);
					queue1.add(new Object());
					--count;
				}
			}
			catch(Exception e){}
		}
	}
}

根据第一题的描述:
    写两个线程,对一个全局变量i,线程A对其从1加到1000,线程B 在i加1后对其显示.

考察的不是阻塞队列,而是线程之间的通信。用到wait()和notify().





不管黑猫白猫能抓老鼠就是好猫,呵呵,在实际项目中很少会用到wait和notify。
0 请登录后投票
   发表时间:2012-03-13  
现在手机不是都能上网吗 笔试机试试 上google 或 baidu 查查直接抄了 还管那么多
0 请登录后投票
   发表时间:2012-03-13  
pengmj 写道
北京-湖南人 写道
pengmj 写道
package org.python.test;

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

/**
 *
 * @author pengmj
 * @since 2012-3-13
 */
public class ThreadTest {
	public volatile static int i = 0;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ThreadTest tt = new ThreadTest();
		tt.run();
	}
	public void run(){
		BlockingQueue<Object> queue1 = new LinkedBlockingQueue<Object>();
		BlockingQueue<Object> queue2 = new LinkedBlockingQueue<Object>();
		queue1.add(new Object());
		new Tadd(queue1,queue2,1000).start();
		new Tprint(queue1,queue2,1000).start();
	}
	public class Tadd extends Thread{
		int count = 0;
		BlockingQueue<Object> queue1;
		BlockingQueue<Object> queue2;
		public Tadd(BlockingQueue<Object> queue1,BlockingQueue<Object> queue2,int count){
			this.queue1 = queue1;
			this.queue2 = queue2;
			this.count = count;
		}
		public void run(){
			try{
				for(int j=1;j<=count;j++){
					queue1.take();
					i++;
					queue2.add(new Object());
				}
			}
			catch(Exception e){}
		}
	}
	public class Tprint extends Thread{
		int count = 0;
		BlockingQueue<Object> queue1;
		BlockingQueue<Object> queue2;
		public Tprint(BlockingQueue<Object> queue1,BlockingQueue<Object> queue2,int count){
			this.queue1 = queue1;
			this.queue2 = queue2;
			this.count = count;
		}
		public void run(){
			try{
				while(count>0){
					queue2.take();
					System.out.println(i);
					queue1.add(new Object());
					--count;
				}
			}
			catch(Exception e){}
		}
	}
}

根据第一题的描述:
    写两个线程,对一个全局变量i,线程A对其从1加到1000,线程B 在i加1后对其显示.

考察的不是阻塞队列,而是线程之间的通信。用到wait()和notify().





不管黑猫白猫能抓老鼠就是好猫,呵呵,在实际项目中很少会用到wait和notify。

看在什么项目中,如果是移动平台开发,wait notify上镜率相当高。
0 请登录后投票
   发表时间:2012-03-13  
太羡慕你们了,还会SSH,老夫现在只会SM了(spring、mybatis)
0 请登录后投票
   发表时间:2012-03-13  
   上机题都不会出很难的
0 请登录后投票
   发表时间:2012-03-13  
O(∩_∩)O哈哈~,上机考试确实很坑爹啊!
0 请登录后投票
   发表时间:2012-03-13  
eaglecn 写道
今天面试了一家做中间件的公司,上来先做了一套题。题很基础。有道题写出对象序列化的伪代码。
还有道题是:写出oracle常用的驱动。JVM初始化的参数。这些题不会。
写完了,要求机试,一小时六道题,必须运行结果正确。说实在的题不难,我一看就知道怎么搞。
真他大爷的眼高手低,第一道题是写两个线程,对一个全局变量i,线程A对其从1加到1000,线程B
在i加1后对其显示。第二道题:写一个socket服务端,要求能服务多个客服端,回写客户端输入。
第三道题:将一个文件中的数字进行排列,排列算法要自己写,将排序结果保存到另一个文件中。
第四道题:XML的。把一段XML文本,加入到一个新的节点下。<a>.....</a>变为<b><a>....<a></b>
最后一道题:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.

哥就写了第一道题,中间接了个凡客诚品的电话,60分钟就过去了。
真够悲催的,这就叫眼高手低啊。手生得很。以前学的东西倒不少
什么EJB,webservice,socket编程,URL编程,java并发编程实践,oracle体系结构
高性能sql语句调整,java反射,java io和NIO,SSH框架,HTTP协议,JSP、servlet,JDBC。
所有技术在上机面前,全都不好使。


呵呵 是东方通吧
0 请登录后投票
   发表时间:2012-03-14  

来个简洁点的:

/**
 * 
 * 写两个线程,对一个全局变量i,线程A对其从1加到1000,线程B 在i加1后对其显示. 
 *
 */
public class SynchronousQueueTest {
	private SynchronousQueue<Integer> sq = new SynchronousQueue<Integer>();
	private AtomicInteger ai = new AtomicInteger();
	
	class AddThread implements Runnable{
		public void run(){
			for(int i=0;i<1000;i++){
				try {
					sq.put(ai.incrementAndGet());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	class ShowThread implements Runnable{
		public void run() {
			while(true){
				try {
					System.out.println(sq.take());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) {
		ExecutorService es = Executors.newFixedThreadPool(2);
		SynchronousQueueTest sqt = new SynchronousQueueTest();
		AddThread at = sqt.new AddThread();
		ShowThread st = sqt.new ShowThread();
		es.submit(at);
		es.submit(st);
	}
}
 
0 请登录后投票
   发表时间:2012-03-14  
javaOak 写道

来个简洁点的:

/**
 * 
 * 写两个线程,对一个全局变量i,线程A对其从1加到1000,线程B 在i加1后对其显示. 
 *
 */
public class SynchronousQueueTest {
	private SynchronousQueue<Integer> sq = new SynchronousQueue<Integer>();
	private AtomicInteger ai = new AtomicInteger();
	
	class AddThread implements Runnable{
		public void run(){
			for(int i=0;i<1000;i++){
				try {
					sq.put(ai.incrementAndGet());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	class ShowThread implements Runnable{
		public void run() {
			while(true){
				try {
					System.out.println(sq.take());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) {
		ExecutorService es = Executors.newFixedThreadPool(2);
		SynchronousQueueTest sqt = new SynchronousQueueTest();
		AddThread at = sqt.new AddThread();
		ShowThread st = sqt.new ShowThread();
		es.submit(at);
		es.submit(st);
	}
}
 

这个好像也没有实现线程A加一后,等待,然后线程B输出i的值,然后线程A再执行....

0 请登录后投票
   发表时间:2012-03-14  
我觉得,别说1小时6道题,能做出3道题,就已经很不错了。
附,凑个热闹,测试通过,第1题:
static Integer i = 0;

	static byte[] lock = new byte[0];

	public static void main(String[] args) {
		PrintThread printThread = new PrintThread();
		AddThread addThread = new AddThread();
		addThread.start();
		printThread.start();
	}

	static class PrintThread extends baseThread {
		@Override
		protected void perform() {
			System.out.println(i);
		}
	}

	static class AddThread extends baseThread {
		@Override
		protected void perform() {
			i++;
		}
	}

	static abstract class baseThread extends Thread {
		public void run() {
			while (true) {
				synchronized (lock) {
					perform();
					lock.notify();
					if (i > 100) {
						return;
					}
					try {
						lock.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		protected abstract void perform();
	}
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics