`

空中网出的线程题

阅读更多

第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下:

	package read;
	
	public class Test {
		
		public static void main(String[] args){
	        
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			/*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
			修改程序代码,开四个线程让这16个对象在4秒钟打完。
			*/
			for(int i=0;i<16;i++){  //这行代码不能改动
				final String log = ""+(i+1);//这行代码不能改动
				{
		     			Test.parseLog(log);
				}
			}
		}
		
		//parseLog方法内部的代码不能改动
		public static void parseLog(String log){
			System.out.println(log+":"+(System.currentTimeMillis()/1000));
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}		
		}
		
	}

 

 

 

答个

 

package thread;
import java.util.ArrayList;
import java.util.List;


	
	public class MainThread5 extends Thread {


		public static void main(String[] args) throws InterruptedException{
	        
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			long a = System.currentTimeMillis()/1000;
			/*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
			修改程序代码,开四个线程让这16个对象在4秒钟打完。
			*/
			List<String> list = new ArrayList<String>();
			for(int i=0;i<16;i++){  //这行代码不能改动
				final String log = ""+(i+1);//这行代码不能改动
				{
					list.add(log);
					if((i+1)%4==0){
						final Object[] objs = list.toArray();  
					new Thread(){
						public void run(){
							for(int j = 0; j < objs.length; j++)
							parseLog(objs[j].toString());	
						}
					}.start();
					list.clear(); 
					}	
				}	
			}
			
		}
		
		//parseLog方法内部的代码不能改动
		public static void parseLog(String log){
			System.out.println(log+":"+(System.currentTimeMillis()/1000));
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}		
		}
		
	}

 

第二题:现成程序中的Test类中的代码在不断地产生数据,然后交给TestDo.doSome()方法去处理,就好像生产者在不断地产生数据,消费者在不断消费数据。请将程序改造成有10个线程来消费生成者产生的数据,这些消费者都调用TestDo.doSome()方法去进行处理,故每个消费者都需要一秒才能处理完,程序应保证这些消费者线程依次有序地消费数据,只有上一个消费者消费完后,下一个消费者才能消费数据,下一个消费者是谁都可以,但要保证这些消费者线程拿到的数据是有顺序的。原始代码如下:

	package queue;
	
	public class Test {
	
		public static void main(String[] args) {
			
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			for(int i=0;i<10;i++){  //这行不能改动
				String input = i+"";  //这行不能改动
				String output = TestDo.doSome(input);
				System.out.println(Thread.currentThread().getName()+ ":" + output);
			}
		}
	}
	
	//不能改动此TestDo类
	class TestDo {
		public static String doSome(String input){
			
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			String output = input + ":"+ (System.currentTimeMillis() / 1000);
			return output;
		}
	}

 

答个

 

package thread;

import java.util.LinkedList;
import java.util.List;

public class MainThread7 {
	public static LinkedList<String> lista = new LinkedList<String>();
		public static void main(String[] args) {
			
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			for(int i=0;i<10;i++){  //这行不能改动
				String input = i+"";  //这行不能改动
				lista.add(input);
			}
			
			for(int i=0; i<10; i++){
			new Thread(){
				public void run(){
					synchronized (lista) {
						String a = lista.poll();
						String output = TestDo2.doSome(a);
						System.out.println(Thread.currentThread().getName()+ ":" + output);
					}
				}
			}.start();
		}
	
}
}


//不能改动此TestDo类
class TestDo2 {
	public static String doSome(String input){
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		String output = input + ":"+ (System.currentTimeMillis() / 1000);
		return output;
	}
}

 

第三题:现有程序同时启动了4个线程去调用TestDo.doSome(key, value)方法,由于TestDo.doSome(key, value)方法内的代码是先暂停1秒,然后再输出以秒为单位的当前时间值,所以,会打印出4个相同的时间值,如下所示:
  4:4:1258199615
  1:1:1258199615
  3:3:1258199615
  1:2:1258199615
        请修改代码,如果有几个线程调用TestDo.doSome(key, value)方法时,传递进去的key相等(equals比较为true),则这几个线程应互斥排队输出结果,即当有两个线程的key都是"1"时,它们中的一个要比另外其他线程晚1秒输出结果,如下所示:
  4:4:1258199615
  1:1:1258199615
  3:3:1258199615
  1:2:1258199616
   总之,当每个线程中指定的key相等时,这些相等key的线程应每隔一秒依次输出时间值(要用互斥),如果key不同,则并行执行(相互之间不互斥)。原始代码如下:

	package syn;

	//不能改动此Test类	
	public class Test extends Thread{
		
		private TestDo testDo;
		private String key;
		private String value;
		
		public Test(String key,String key2,String value){
			this.testDo = TestDo.getInstance();
			/*常量"1"和"1"是同一个对象,下面这行代码就是要用"1"+""的方式产生新的对象,
			以实现内容没有改变,仍然相等(都还为"1"),但对象却不再是同一个的效果*/
			this.key = key+key2; 
			this.value = value;
		}


		public static void main(String[] args) throws InterruptedException{
			Test a = new Test("1","","1");
			Test b = new Test("1","","2");
			Test c = new Test("3","","3");
			Test d = new Test("4","","4");
			System.out.println("begin:"+(System.currentTimeMillis()/1000));
			a.start();
			b.start();
			c.start();
			d.start();
		}
		
		public void run(){
			testDo.doSome(key, value);
		}
	}

	class TestDo {

		private TestDo() {}
		private static TestDo _instance = new TestDo();	
		public static TestDo getInstance() {
			return _instance;
		}

		public void doSome(Object key, String value) {
	
			// 以大括号内的是需要局部同步的代码,不能改动!
			{
				try {
					Thread.sleep(1000);
					System.out.println(key+":"+value + ":"
							+ (System.currentTimeMillis() / 1000));
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

	}

 
答个

 

 


 

分享到:
评论

相关推荐

    空中网线程题整理

    在该题中,要求实现一个程序,能够利用多个线程打印出16个数字。具体要求为:创建16个线程,每个线程调用`parseLog()`方法打印一个数字。最终的效果是这16个数字按照顺序被打印出来,并且每个数字后面跟随着当前的...

    多线程面试题

    本文将围绕“多线程面试题”这一主题,深入探讨相关概念、技术及其应用。 1. **线程的概念**:线程是程序执行的最小单位,一个进程可以有多个线程同时执行任务,提高了程序的运行效率。 2. **Java中的线程创建方式...

    CC++多线程编程练习题大全

    **CC++多线程编程**是现代软件开发中的重要组成部分,尤其在高性能计算、服务器端应用和实时系统中,多线程技术能充分利用多核处理器的资源,提高程序的执行效率。以下是一些关于CC++多线程编程的核心知识点: 1. *...

    java基础多线程练习题(1)

    总结来说,Java基础多线程练习题主要涵盖了线程的创建、同步与通信、线程安全以及并发工具的使用。通过这些题目,你可以更好地理解线程的工作原理,学会在实际项目中有效利用多线程提高程序性能,避免潜在的问题。在...

    C#面试题 包括 ADO.net 多线程等

    C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等

    线程编程面试题

    ### 线程编程面试题详解 #### 60、Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? - **实现线程的方法**:Java中实现线程有两种基本方式: - 继承`Thread`...

    java经典多线程面试题

    以下是一些经典的多线程面试题知识点: 1. Java中的线程状态有哪些? - 新建状态(New):线程对象创建后,但尚未启动。 - 就绪状态(Runnable):处于就绪状态的线程随时可能被CPU调度执行。 - 运行状态...

    哈哈iOS多线程面试题

    在探讨iOS多线程的面试题目时,我们首先要明确进程和线程的定义及其关系。进程可以被理解为计算机上一次执行活动的程序,它是操作系统分配资源的基本单元,拥有独立的内存空间和运行所需的全部资源。当我们提到一个...

    多线程面试59题(含答案).pdf

    多线程面试59题(含答案)是关于多线程编程的知识点总结,涵盖了多线程的基本概念、优点、线程和进程的区别、Java 实现多线程的方式、启动线程方法的区别、终止线程的方式、线程的生命周期、wait()和 sleep()方法的...

    多线程经典面试题和答案

    ### 多线程经典面试题解析 #### Java 实现线程的方式 1. **继承 `Thread` 类**:这是最直接的方式,通过继承 `Thread` 类,并重写 `run()` 方法来实现线程的逻辑。这种方式简单直接,但是因为 Java 不支持多重继承...

    java多线程面试题和答案

    在Java编程领域,多线程是一项至关重要的技术,特别是在开发高效、响应迅速的应用程序时。以下是一些关于Java多线程的面试题...在实际项目中,理解并熟练运用这些概念能够帮助开发者构建出更加高效、健壮的多线程应用。

    java多线程面试题59题集合

    - interrupt():设置线程的中断标志,不立即停止线程,而是在线程检查中断状态时抛出InterruptedException。 - isInterrupted():检查线程是否被中断。 - interrupted():检查并清除中断标志,返回当前中断状态。...

    多线程,多线程面试题,C#源码.zip

    使用`try-catch-finally`结构可以捕获和处理异常,而`ThreadAbortException`是线程被强制终止时抛出的特殊异常。 线程池是一种优化线程创建和销毁的机制,它管理一组可重用线程,减少系统开销。C#中的`ThreadPool`...

    线程面试题

    ### Java线程面试题知识点详解 #### 一、线程基本概念 1. **什么是线程?** - 线程是操作系统中能够独立运行的最小单位,它被包含在一个进程中,是进程中的实际执行单元。通过多线程编程可以有效利用多核处理器...

    java面试题_多线程(68题)

    Java多线程是Java编程中的核心概念,尤其在面试中,它是考察开发者高级技能和并发理解的关键领域。这里,我们将深入探讨与Java多线程相关的68个面试问题,涵盖基础知识、线程安全、同步机制、线程池、死锁等关键知识...

    java面试题_多线程(68题).pdf

    Java中的多线程是面试中常见的话题,涵盖了操作系统的基础概念以及Java并发库的高级特性。以下是对这些知识点的详细解释: 1. **线程**:线程是操作系统调度的基本单元,一个进程中可以有多个线程并发执行。在多...

    Java线程面试题Top50[参照].pdf

    Java 线程面试题 Top 50 Java 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。 一、什么是...

    java多线程知识讲解及练习题

    Java 多线程知识讲解及练习题 Java 多线程基础知识的了解是 Java 程序设计的重要组成部分,本资源摘要信息对 Java 多线程基础知识进行了详细的讲解和练习题。 1. sleep() 和 wait() 的区别 sleep() 是 Thread 类...

Global site tag (gtag.js) - Google Analytics