java多线程面试题(上机代码实现)

1、编写线程、实现子线程先循环10次、接着主线程循环20、再接着子线程循环10次、主线程循环20次、反复进行50次

package com.interview_questions.first;

public class OrderThread {

	private boolean flag=false;
	
	//子线程
	public synchronized void sub(){
		while(flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		for(int i=0;i<10;i++){
			System.out.println("子线程"+i);
		}
		flag = true;
		this.notify();
	}
	
	//主线程
	public synchronized void main(){
		while(!flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		for(int i=0;i<20;i++){
			System.out.println("主线程"+i);
		}
		flag = false;
		this.notify();
	}
}
package com.interview_questions.first;

public class CallThread implements Runnable {
	private OrderThread orderThread;
	public CallThread(OrderThread orderThread){
		this.orderThread=orderThread;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<50;i++){
			orderThread.sub();
		}
	}

}
package com.interview_questions.first;

public class CallThread2 implements Runnable {
	private OrderThread orderThread;
	public CallThread2(OrderThread orderThread){
		this.orderThread=orderThread;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<50;i++){
			orderThread.main();
		}
	}

}
package com.interview_questions.first;


public class Test {
	public static void main(String[] args) {
		OrderThread orderThread = new OrderThread();
		CallThread callThread = new CallThread(orderThread);
		CallThread2 callThread2 = new CallThread2(orderThread);
		Thread t = new Thread(callThread);
		Thread t2 = new Thread(callThread2);
		t.start();
		t2.start();
	}
}

2、使用Lock和Condition实现子线程先循环10次、接着主线程循环20、再接着子线程循环10次、主线程循环20次、反复进行50次

package com.interview_questions.second;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class OrderThread {
    
	private boolean flag = false;
	Lock lock = new ReentrantLock();
	Condition con=lock.newCondition();
	
	//子线程
	public void sub(){
		lock.lock();
		try{
			while(flag){
				try {
					con.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			for(int i=0;i<10;i++){
				System.out.println("子线程"+i);
			}
			flag = true;
			con.signal();
		}finally{
			lock.unlock();
		}
	}
	
	//主线程
	public void main(){
		lock.lock();
		try{
			while(!flag){
				try {
					con.await();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			for(int i=0;i<20;i++){
				System.out.println("主线程"+i);
			}
			flag = false;
			con.signal();
		}finally{
			lock.unlock();
		}
	}
}
package com.interview_questions.second;

public class CallThread implements Runnable {
	private OrderThread orderThread;
	public CallThread(OrderThread orderThread){
		this.orderThread=orderThread;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<50;i++){
			orderThread.sub();
		}
	}

}
package com.interview_questions.second;

public class CallThread2 implements Runnable {
	private OrderThread orderThread;
	public CallThread2(OrderThread orderThread){
		this.orderThread=orderThread;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<50;i++){
			orderThread.main();
		}
	}

}
package com.interview_questions.second;


public class Test {
	public static void main(String[] args) {
		OrderThread orderThread = new OrderThread();
		CallThread callThread = new CallThread(orderThread);
		CallThread2 callThread2 = new CallThread2(orderThread);
		Thread t = new Thread(callThread);
		Thread t2 = new Thread(callThread2);
		t.start();
		t2.start();
	}
}

3、设计4个线程、实现2个线程对i加一,2个线程对i进行减一

package com.interview_questions.thrid;

public class Test {
	private int i=0;
	private synchronized void add(){
		i++;
		System.out.println(Thread.currentThread().getName()+"加"+i);
	}
	private synchronized void sub(){
		i--;
		System.out.println(Thread.currentThread().getName()+"减"+i);
	}
	
	//实现内部类
	class First implements Runnable{
		public void run() {
			add();
		}
	}
	
	//实现内部类
	class Second implements Runnable{
		public void run() {
			sub();
		}
	}
	
	public static void main(String[] args) {
		Test test = new Test();
		First f = test.new First();
		Second s = test.new Second();
		
		for(int i = 0; i < 2; i++){
			Thread t = new Thread(f);
			t.start();
			Thread t1 = new Thread(s);
			t1.start();
		}
	}
}

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

package com.interview_questions.four;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockQueueTest {
    
	//parseLog方法内部的代码不能改动
    public static void parseLog(String log){
        System.out.println(log+":"+(System.currentTimeMillis()/1000));
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }        
    }
	
	public static void main(String[] args) {
		//定义一个线程共享的队列容器,可以使得数据由队列的一端输入,从另外一端输出
	    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) {
                        e.printStackTrace();
                    }
            }
        }
	    
	    for(int i=0;i<4;i++){
            new Thread(new Runnable(){

                @Override
                public void run() {
                    while(true){
                        try {
                            parseLog(queue.take());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                
            }).start();
        }
	}
	
    
}

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值