`

答复: 迅雷亲历面经:JAVA 笔试+上机+面试(完整面试题大讨论)

阅读更多
引用
有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…


引申了一下:

有n个线程,ID为0...n-1,在屏幕上循环打印m次012..n-1

用 c/pthread 实现

//@Author      : idup2x@gmail.com
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>

#define GROUP_COUNT 100
#define GROUP_SIZE 4 

typedef struct {
	pthread_mutex_t mutex;
	pthread_cond_t cond;
	int index;
} syn_obj_t;

syn_obj_t syn_obj = {PTHREAD_MUTEX_INITIALIZER, 
	PTHREAD_COND_INITIALIZER, 0};

typedef struct {
	int flag;
} elem_t; 

void *
thread_routine(void *arg);

int
main(int argc, char** argv)
{
	elem_t elems[GROUP_SIZE];
	pthread_t pds[GROUP_SIZE];
	int i;

	printf("syn_obj.index = %d\n", syn_obj.index);

	for (i = 0; i < GROUP_SIZE; i++) {
		elems[i].flag = i;
		if ( (pthread_create(&pds[i], NULL, thread_routine, &elems[i])) != 0 ) {
			perror("pthread create");
			exit(-1);
		}
	}

	for (i = 0; i < GROUP_SIZE; i++) {
		pthread_join(pds[i], NULL);
	}

	pthread_mutex_destroy(&syn_obj.mutex);
	pthread_cond_destroy(&syn_obj.cond);

	printf("\nsyn_obj.index = %d\n", syn_obj.index);

	return 0;
}

void *
thread_routine(void *arg) {
	elem_t *elem = (elem_t *)arg;
	int i;
	for (i = 0; i < GROUP_COUNT; i++) {
		pthread_mutex_lock(&syn_obj.mutex);
		while ( (syn_obj.index % GROUP_SIZE) != elem->flag ) {
			pthread_cond_wait(&syn_obj.cond, &syn_obj.mutex);
	 	}
		printf("%d", elem->flag);
		if ( 0 == (syn_obj.index+1) % GROUP_SIZE ) {
			printf("\t");
		}
		syn_obj.index++;
		pthread_cond_broadcast(&syn_obj.cond);
		// may be cause deadlock 
		// pthread_cond_signal(&syn_obj.cond);
		pthread_mutex_unlock(&syn_obj.mutex);
		// sleep(1);
	}
	return NULL;
}
分享到:
评论
26 楼 panshunchang 2010-06-03  
public class TestThread {

static Boolean[] str = new Boolean[]{true,false,false};

public static void main(String[] args) throws InterruptedException {
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
Thread3 t3 = new Thread3();
t1.start();
// //t1.join();
t2.start();
// //t2.join();
t3.start();
//t3.join();
}



static class Thread1 extends Thread{
public void run(){
int i=10;
while(i>0){
synchronized (str) {
if(str[0]){
System.out.print("A");
i--;
str[0] =false ;
str[1] = true;
str.notifyAll();
}else{
try {
str.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

static class Thread2 extends Thread{
public void run(){
int i=10;
while(i>0){
synchronized (str) {
if(str[1]){
System.out.print("B");
i--;
str[1] = false ;
str[2] = true;
str.notifyAll();
}else{
try {
str.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


static class Thread3 extends Thread{

public void run(){
int i=10;
while(i>0){
synchronized (str) {
if(str[2]){
System.out.print("C");
i--;
str[2] = false;
str[0] = true;
str.notifyAll();
}else{
try {
str.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}
25 楼 iceman1952 2010-04-24  
不输出ABC啦,就输出A0A1A2....
package xunlei;

import java.util.ArrayList;

class CtrlStruct {
	private Object objLock = new Object();
	private int threadCount;
	private int loopCount;
	private int hasRunTimes;

	public int getThreadCount() {
		return threadCount;
	}

	public void setThreadCount(int threadCount) {
		this.threadCount = threadCount;
	}

	public int getLoopCount() {
		return loopCount;
	}

	public void setLoopCount(int loopCount) {
		this.loopCount = loopCount;
	}

	public Object getObjLock() {
		return objLock;
	}

	public int getHasRunTimes() {
		return hasRunTimes;
	}

	public void setHasRunTimes(int threadCount) {
		this.hasRunTimes = threadCount;
	}

}

class OutputName extends Thread {
	private int index;
	private CtrlStruct tt;

	public OutputName(int index, CtrlStruct tt) {
		super("A" + index);
		this.index = index;
		this.tt = tt;
	}

	public void run() {
		int count = 0;
		synchronized (tt.getObjLock()) {
			while (count < tt.getLoopCount()) {
				// 不该打印自己,则等待
				while (index != tt.getHasRunTimes() % tt.getThreadCount()) {
					try {
						tt.getObjLock().wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				count++;
				tt.setHasRunTimes((tt.getHasRunTimes()) + 1);
				System.out.print(Thread.currentThread().getName());
				tt.getObjLock().notifyAll();
			}
		}

	}

}

public class Test {
	public static void main(String[] args) {
		int threadCount = 3;
		int loopCount = 10;
		ArrayList list = new ArrayList();
		CtrlStruct cs = new CtrlStruct();
		for (int i = 0; i < threadCount; i++) {
			OutputName opn = new OutputName(i, cs);
			list.add(opn);
		}
		cs.setLoopCount(loopCount);
		cs.setThreadCount(threadCount);
		cs.setHasRunTimes(0);
		for (int i = 0; i < list.size(); i++) {
			((Thread) list.get(i)).start();
		}
	}
}

24 楼 黑山老妖 2010-03-03  
public class ThreadPrintABC {
	public static void main(String args[]) {
		Print p = new Print();
		new PrintThread(p);
		new PrintThread(p);
		new PrintThread(p);
	}
}
/**
 * 打印类,打印类负责打印的内容。
 * @author 
 *
 */
class Print {
	String word = "A";
	void print() {		
		System.out.print(word);
		if (word.equals("A")) {
			word = "B";
		} else if (word.equals("B")) {
			word = "C";
		} else if (word.equals("C")) {
			word = "A";
		}

	}
}
/**
 * 打印线程,只负责调用打印类。不负责打印内容。
 * @author
 *
 */
class PrintThread implements Runnable {
	Print p;
	Thread t;

	PrintThread(Print p) {
		this.p = p;
		t = new Thread(this);
		t.start();
	}

	public void run() {
		int j = 10;
		while (j > 0) {
			synchronized (p) {//同步 重要 不然打印顺序会乱
				p.print();
				j--;
			}			
		}
	}

}

23 楼 laoshifu 2010-03-01  
swen00 写道
闲来也写个,我这不用同步实现..
public class TestThread {
    static int num = 1;

    public static void main(String ds[]){
        new DemoThread(1,"A").start();
        new DemoThread(2,"B").start();
        new DemoThread(0,"C").start();
    }

    static class DemoThread extends Thread {
        int id;
        String pintln_str;
       
        public DemoThread(int id,String pintln_str) {
            this.id = id;
            this.pintln_str = pintln_str;
        }

        int print_num = 10;

        public void run() {           
            while (print_num > 0) {
                if (num%3 == id) {
                    System.out.print(pintln_str);
                    num ++ ;
                    print_num--;
                }
            }
        }
    }
}

浏览了所有回帖,发现这个是最精炼的。
22 楼 zhuyx808 2009-12-16  
其实我有个恶心的解法:

公用方法D{
System.out.println("abc");


线程A{
公用方法D

线程B{
公用方法D

线程C{
公用方法D
21 楼 shadao 2009-12-15  
@Test
    public void helloThreads() throws InterruptedException {

        final int threads = 9;
        final int times = 6;

        ExecutorService service = Executors.newFixedThreadPool(threads);
        final Lock lock = new ReentrantLock();

        final Condition[] conditions = new Condition[threads];
        for (int i = 0; i < conditions.length; i++) {
            conditions[i] = lock.newCondition();
        }

        Runnable[] runs = new Runnable[threads];
        for (int i = 0; i < runs.length; i++) {
            runs[i] = new Runer(i) {

                @Override
                public void run() {
                    int t = times;
                    while (t-- > 0) {
                        lock.lock();
                        try {
                            conditions[index].await();
                            //work
                            System.out.print(Thread.currentThread().getName());
                            System.out.print(" ");
                            
                            int nextIndex = index+1;
                            if(nextIndex==threads){
                                nextIndex = 0;
                                //for beautiful
                                System.out.println();
                            }
                            
                            //give a signal to next thread
                            conditions[nextIndex].signalAll();
                        } catch(Exception ex){
                            ex.printStackTrace();
                        } finally {
                            lock.unlock();
                        }
                    }
                }
            };
        }

        for(Runnable r:runs){
            service.execute(r);
        }

        //first one
        lock.lock();
        conditions[0].signalAll();
        lock.unlock();

        //hold on
        Thread.sleep(Long.MAX_VALUE);
    }

    abstract class Runer implements Runnable{
        protected final int index;
        
        public Runer(int index){
            this.index = index;
        }

    }
20 楼 fy_kenny 2009-12-15  
有没有线程间通信的机制?

现成的类有吗?

比方说ThreadGroup可以利用吗
19 楼 lj830723 2009-12-12  
线程方面不太熟悉,正在学习中,借鉴楼上的了各种方法了
18 楼 gq913 2009-12-11  
java synchronized方法就搞定了 有那么麻烦吗?
17 楼 swen00 2009-12-11  
闲来也写个,我这不用同步实现..
public class TestThread {
    static int num = 1;

    public static void main(String ds[]){
        new DemoThread(1,"A").start();
        new DemoThread(2,"B").start();
        new DemoThread(0,"C").start();
    }

    static class DemoThread extends Thread {
        int id;
        String pintln_str;
       
        public DemoThread(int id,String pintln_str) {
            this.id = id;
            this.pintln_str = pintln_str;
        }

        int print_num = 10;

        public void run() {           
            while (print_num > 0) {
                if (num%3 == id) {
                    System.out.print(pintln_str);
                    num ++ ;
                    print_num--;
                }
            }
        }
    }
}
16 楼 chenyongan 2009-12-11  
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class TestThread {

/**
* @param args
*/
public static void main(String[] args) {
MyThread b = null;
MyThread c = null;
MyThread a = null;
Status status = new Status();
a = new MyThread("A", 0, status);
b = new MyThread("B", 1, status);
c = new MyThread("C", 2, status);
b.start();
c.start();
a.start();
}
}

class Status {
private int all = 30;

private int i = 0;
private boolean isOver=false;

public boolean isOver() {
return isOver ;
}

public synchronized void next() {
if(all-1>i){
i++;
}else{
isOver=true;
}
}
public int getStatus(){
return i%3;
}
}

class MyThread extends Thread {
public int status;
public Status s;
public MyThread(String name, int status, Status s) {
super(name);
this.status = status;
this.s = s;
}

public void run() {
while (!s.isOver()) {
if (s.getStatus()== status) {
System.out.print(this.getName());
s.next();
}
}
}
}
15 楼 wandou 2009-12-10  

interface IWakeAble{
    void wakeMe();
    void addSleepListener(ISleepListener listener);
}
interface ISleepListener{
    void beforeSleep(Object sender);
}
ThreadA,b,c 实现 IWakeAble;然后用一个ThreadManager去监听beforeSleep事件,一个完成了就wake下一个。


14 楼 dengmingfeng 2009-12-09  
好像是深圳的面试题,
13 楼 huohu0321 2009-12-07  
java中用Executors.newSingleThreadExecutor(),执行线程行不。
12 楼 qeppykqsn 2009-12-07  
楼主,这可是人家的机密。。。你。。。你。。。你。。。
11 楼 trydofor 2009-12-07  
来个好玩的
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class TBThread {
	public static void main(String[] args) {
		List<String>  work = new ArrayList<String>(Arrays.asList("123456789".split("")));
		work.removeAll(Collections.singletonList(""));
		final List<String> task = new ArrayList<String>(work);
		Collections.shuffle(work);
		System.out.print("work:");
		for(String s :work)System.out.print(","+s);
		System.out.print("\ntask:");
		for(String s :task)System.out.print(","+s);
		System.out.print("\nexec:");
		
		for(final String s :work){
			new Thread(){
				public void run() {
					try {
						sleep(new Random().nextInt(5000));
						synchronized (task) {
							if(task.isEmpty()) return;
							while(!s.equals(task.get(0))) task.wait();
							System.out.print(","+task.remove(0));
							task.notifyAll();
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}.start();
		}
	}
}
10 楼 sun_cyj 2009-12-06  
package com.test;

public class Test {
	public static void main(String[] args) {
		ThreadRun A = new ThreadRun();
		ThreadRun B = new ThreadRun();
		ThreadRun C = new ThreadRun();
		A.setName("A");
		A.setCanRun(true);
		A.setNextRun(B);
		B.setName("B");
		B.setNextRun(C);
		C.setName("C");
		C.setNextRun(A);
		A.start();
		B.start();
		C.start();
	}
}
class ThreadRun extends Thread
{
	//private static int runTime = 1;
	private ThreadRun nextRun;
	
	
	private boolean canRun;
	
	
	
	public ThreadRun getNextRun() {
		return nextRun;
	}



	public void setNextRun(ThreadRun nextRun) {
		this.nextRun = nextRun;
	}



	


	public boolean isCanRun() {
		return canRun;
	}



	public void setCanRun(boolean canRun) {
		this.canRun = canRun;
	}



	public void run() {
		for (int i = 0; i < 10; ) {
			if(this.canRun)
			{
				System.out.println(this.getName());
				nextRun.setCanRun(true);
				this.setCanRun(false);
				i++;
				
			} else
				try {
					this.sleep(1);
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}
		}
		
		
	}
}

9 楼 wave-labs 2009-12-06  
一种没有使用并发包的实现。遇到一个问题,lock对象如果直接用Integer会异常,封装成Lock类就可以了。
public class SequenceTask {

	private static volatile Lock lock = new Lock();

	private static String[] infos = { "A", "B", "C" };

	public static void main(String[] args) {
		for (int i = 0; i < infos.length; i++) {
			Thread thread = new Thread(new PrintTask(i));
			thread.start();
		}
	}

	static class Lock {
		private int flag = 0;

		public int getFlag() {
			return flag;
		}

		public void setFlag(int flag) {
			this.flag = flag;
		}
	}

	static class PrintTask implements Runnable {
		private int id;

		public PrintTask(int id) {
			this.id = id;
		}

		public void run() {
			while (true) {
				synchronized (lock) {
					if (lock.getFlag() == id) {
						System.out.print(infos[id]);
						lock.setFlag((id + 1) % infos.length);
						lock.notifyAll();
					} else {
						try {
							lock.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
8 楼 flyingpig4 2009-12-06  
我参照了下兄弟们写的,用的是JAVA5.0的ReentrantLock也写了一个:
大家一起一为鉴赏一下
调用类:FuLockThreadTest //用于线程ABC的调用实现
public class FuLockThreadTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 加锁实现
new Thread(new FuLockThread(0), "A").start();// 注意线程命名
new Thread(new FuLockThread(1), "B").start();
new Thread(new FuLockThread(2), "C").start();
}
}
线程类:FuLockThread //用ReentrantLock加锁机制实现,注意在finally里面实现解锁
import java.io.IOException;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class FuLockThread extends Thread {

private int id;
private static int count = 0;// 活学活用static类型
private int pcount;
private boolean mark = true;
private ReentrantLock lock;
private Condition condition;

public FuLockThread(int id) {
this.id = id;
lock = new ReentrantLock();
condition = lock.newCondition();
}

@Override
public void run() {
// TODO Auto-generated method stub
// 当前的count计数为id值,则进行输出
// 加锁实现

lock.lock();
try {// 加锁实现
while (mark) {
if (count % 3 == id) {
System.out.print(Thread.currentThread().getName());
count++;
pcount++;
condition.signalAll();
if (pcount == 10)
mark = false;
}
}
} finally {
if (count % 3 != id) {
try {
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
lock.unlock();
}
}
}
7 楼 shelocks 2009-12-06  
sunzixun 写道
easonfans 写道
shelocks 写道
   贴一个Java的,实现可能和楼主的有些差别,输出A、B、C分别使用三个不同的线程类。不过原理都是一样,实现线程的顺序调度。判断条件,不满足的话,等待;接到通知以后,重新判断。
public class SequenceWork {

    private static Boolean[] abc = {false, false, true};

    public static void main(String[] args) {
        ThreadA a = new ThreadA();
        a.start();
        ThreadB b = new ThreadB();
        b.start();
        ThreadC c = new ThreadC();
        c.start();
    }

    static class ThreadA extends Thread {

        public void run() {
            while (true) {
                synchronized (abc) {
                    if (abc[2]) {
                        System.out.print("A");
                        abc[0] = true;
                        abc[2] = false;
                        abc.notifyAll();
                    } else {
                        try {
                            abc.wait();
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }

                }
            }

        }
    }
//。。。。。。。。。。。。。

楼上的解法正点!


万一是线程池呢。。。。。。你的代码就吓死人了哈哈


  输出A、B、C是三个不同的任务,他们之间要以一种顺序化的顺序调度,而不是简单的在一个线程里输出不同的标志位。上面的示例代码代码是extends thread,你完全可以把它实现为Runnable。跟线程池有什么关系。

相关推荐

    javaee笔试题-Notes-For-Interviews:Java-Web开发-后台开发面试笔记

    有很多很有趣的知识点,但是以面试题为主,还是有点把自己当速成:chicken:的感觉 然后主要看面试Blog,Rico的博客, 数据库原理,操作系统,计算机网络,第一次看JUC包,之前谁管过这个,真没用过锁 第一场面试之前...

    必联采购网java程序员笔试题.doc

    必联采购网的Java程序员笔试题涉及到多个Java Web开发的核心知识点,这些题目旨在考察应聘者的编程基础、异常处理能力、前端知识、框架理解以及实际项目经验。下面是对这些知识点的详细说明: 1. **Java连接数据库...

    中软笔试题目--亲历

    中软笔试题目是指中软公司的笔试题目,该公司是中国最大的软件公司之一,笔试题目涵盖了软件开发、数据库、算法、软件工程、网络模型、面向对象、编程语言等多个方面,本文将对笔试题目的各个部分进行概括和分析。...

    打造Facebook:亲历Facebook爆发的5年

    这本书的书名——《打造Facebook:亲历Facebook爆发的5年》很嚣张,谁有资格可以说这句话呢,当然,扎克伯格最有资格,但他不会亲自来告诉你,至少从目前的情况来看,近几年都不大可能。而且,这不是一个人的公司。...

    俄罗斯方块游戏源码-Java

    深度实战:全面覆盖游戏逻辑、图形渲染、事件处理等核心技术点,让您亲历从零到一完整的游戏开发流程。 丰富玩法:原汁原味还原经典模式,同时具备流畅的方块旋转、平移、锁定功能,更有刺激的消除行分计算系统,...

    清华大学java实验指导

    3. **JavaApplication开发**:通过示例程序(如“Hello World”),学生将亲历程序的编写、保存、编译与运行全过程。 4. **JavaApplet初步**:虽然未详述,但介绍Applet的基本结构与开发流程,为更复杂的应用打下...

    大型网站技术架构:核心原理与案例分析+李智慧.带目录书签.清晰.完整版

    本书作者是阿里巴巴网站构建的亲历者,拥有核心技术部门的一线工作经验,直接体验了大型网站构建与发展过程中的种种生与死,蜕与变,见证了一个网站架构从幼稚走向成熟稳定的历程。 本书通过梳理大型网站技术发展...

    大型网站技术架构:核心原理与案例分析+李智慧

    本书作者是阿里巴巴网站构建的亲历者,拥有核心技术部门的一线工作经验,直接体验了大型网站构建与发展过程中的种种生与死,蜕与变,见证了一个网站架构从幼稚走向成熟稳定的历程。 本书通过梳理大型网站技术发展...

    Spring Cloud分布式微服务实战视频教程(养成应对复杂业务的综合技术能力).rar

    附完整源码,这是一门培养应对复杂业务的综合技术能力的实战课程,本课采用前后端分离开发模式,严格遵守企业级架构和规范,带你开发门户平台+媒体中心+运营中心三大业务的企业级自媒体平台。一个项目贯穿后端主流...

    java-工程师就业前景.doc

    全球有25亿Java器件运行着Java,450多万Java开发者活泼在地球的每个角落,数以千万计的Web用户每次上网都亲历Java的威力。 Java软件工程师的薪水相对较高。通常来说,具有3~5年开发经验的工程师,拥有年薪10万元是...

    七问七答:亲历者讲阿里中台落地的实践.docx

    作者在阿里巴巴交易平台的工作经验中发现,尽管有技术大牛,但由于缺乏对平台能力的有效管理,导致需求处理效率低下。通过构建运营平台,进而发展到交易中台,逐步完善业务视图,提升了平台对业务需求的响应速度和...

    七问七答:亲历者讲阿里中台落地的实践.pdf

    在企业数字化转型和互联网浪潮推动下,阿里巴巴集团的中台战略实践成为了业界瞩目的焦点,对众多企业而言,中台不单是一项新技术的运用,更是整个企业IT架构和组织结构的一次深刻变革。本文将深入探讨阿里中台落地...

    聚焦核心素养案例研讨专题一:亲历数据采集,感知数据处理.pdf

    #资源达人分享计划#

    亲历基本OSGI实例,进入另番思维领域(转)----包括打包发布为可执行文件

    OSGi是一种模块化系统和Java服务框架,它允许在运行时动态地发现、加载、卸载和管理软件组件,极大地增强了Java应用程序的灵活性和可维护性。 在描述中,虽然没有提供具体的信息,但我们可以推断这是一篇个人经验...

    亲历:果敢战火下的中缅边民.docx

    亲历:果敢战火下的中缅边民.docx

    亲历:华为IPD.docx

    《亲历华为IPD:理解与实践》 集成产品开发(IPD,Integrated Product Development)是华为公司在2003年引入的一种先进的产品开发管理模式,源自IBM的改革实践。IPD的核心理念在于通过跨部门、跨职能的团队协作,...

    亲历:华为IPD.pdf

    【集成产品开发(IPD)】是华为引入的一种先进的产品开发模式,源于IBM的企业改革实践。IPD的核心理念是强调跨部门协作和整体责任,旨在提高产品研发效率和产品质量,确保产品的市场效益。以下是对IPD的详细阐述: ...

    【完整版15章】SpringCloud分布式微服务实战,打造大型自媒体3大业务平台视频教程

    SpringCloud分布式微服务实战,打造大型自媒体3大业务平台视频教程,完整版15章,附源码下载。课程特色: 1、一课开发三大业务,打造企业级大型自媒体平台:囊括门户平台+媒体中心+运营中心,好项目助力你全面成长...

Global site tag (gtag.js) - Google Analytics