多线程的简单编程题

1.实现一个Runnable。在run内部打印一个消息,然后调用yield()。重复这个操作三次
然后从run中返回。在构造器中放置一条启动消息,并且放置一条在任务终止时的关闭
消息,使用线程创建大量的这种任务并驱动他们。

public class Project_one implements Runnable{
	private String name;   //任务名
    public Project_one(String name) {  
    	this.name = name;
    	System.out.println(this.name+"正在启动");
    }
	@Override
	public void run() {
		for(int i=0;i<3;i++) {
			 System.out.println(this.name+"运行中——————");
		     Thread.yield();
		}
		System.out.println(this.name+"运行成功");
	}
	public static void main(String[] args) {
		new Thread(new Project_one("一号")).start();
		new Thread(new Project_one("二号")).start();
		new Thread(new Project_one("三号")).start();
	}
}

2.遵循generic/Fibonacci.java的形式,创建一个任务,它可以产生由n个斐波那契数字组成的序列,
其中n是通过任务的构造器而提供的。使用大量线程创建这种任务并驱动他们。

public class Project_one implements Runnable{
	private String name;   //任务名
	private int n;
	@SuppressWarnings("unused")
	private int[] s;
    public Project_one(String name,int n) {  
    	this.name = name;
    	this.n = n;
    	System.out.println(this.name+"正在启动");
    }
	@Override
	public void run() {
		s = new int[n];
		s[0] = 1;
		s[1] = 1;
		for(int i=2;i<this.n;i++) {
			 s[i]=s[i-1]+s[i-2];
			 Thread.yield();
		}
		System.out.println(this.name+"运行成功");
		print();
	}
	public void print() {
		System.out.println(this.name+":");
		for(int i=0;i<this.n;i++) {
			System.out.print(s[i]+" ");
		}
		System.out.println();
	}
	public static void main(String[] args) {
		new Thread(new Project_one("一号",5)).start();
		new Thread(new Project_one("二号",6)).start();
		new Thread(new Project_one("三号",7)).start();
	}
}

3.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15.
接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75。

public class Main {

	public static void main(String[] args)
	{
		Object ob = new Object();
		new Thread(new Ran(1,"一号",ob)).start();
		new Thread(new Ran(2,"二号",ob)).start();
		new Thread(new Ran(3,"三号",ob)).start();
	}

}
class Ran implements Runnable{
    Object ob;    //锁
    int id;         //线程id
    String name;   //线程名
    static int count=0;
    public Ran(int id,String name,Object ob) {
    	this.id = id;
        this.name = name;
        this.ob = ob;
    }
	@Override
	public void run() {
		while(count<75) {        //循环到75
			synchronized(ob) {
				if(count/5%3+1==id) {       //如果等于线程id就进来打印
					System.out.println(this.name);
					for(int i=0;i<5;i++) {
						count++;
						System.out.print(count+" ");
					}
					System.out.println();
					ob.notifyAll();	 //打印完成唤醒其他线程
			     }
			   else {          //否则就等待
				   try {
					ob.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	   }	
	 }
}

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

public class Main {

	public static void main(String[] args){
        
        System.out.println("begin:"+(System.currentTimeMillis()/1000));
        /*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
        修改程序代码,开四个线程让这16个对象在4秒钟打完。
        */
        //定义一个任务队列,使得消息从一端进去,一端处理
        final BlockingQueue<String> queue=new ArrayBlockingQueue<String>(16);   //里面自带锁
        for(int i=0;i<16;i++){  //这行代码不能改动
            final String log = ""+(i+1);//这行代码不能改动
            {
            	     try {
						queue.put(log);  //将消息存进去
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
            }
        }
        for(int i=0;i<4;i++) {
        	new Thread() {
        		public void run(){
        			while(true) {
        				try {
						Main.parseLog(queue.take());
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
        			}
        		}
        	}.start();
        }
    }
    //parseLog方法内部的代码不能改动
    public static void parseLog(String log){
        System.out.println(log+":"+(System.currentTimeMillis()/1000));
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }        
    }
}

后续还有更新!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值