Google面试题(java)—有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD

来源:互联网 发布:转移矩阵和马尔科夫链 编辑:程序博客网 时间:2024/05/16 00:41

转自:http://blog.csdn.net/b275518834/article/details/8750142


import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class CallThread {private static class MyRunable implements Runnable {int index = 0;int max = 4 * 2;HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();{for (int i = 0; i < 4; i++) {map.put(i, new ArrayList<Integer>());}}boolean isRunning = true;public synchronized void run() {while (true) {int name = Integer.valueOf(Thread.currentThread().getName());while (index % 4 != name) {try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (!isRunning) {return;}}try {Thread.sleep(1000);} catch (InterruptedException e) {}for (int i = 0, arrIndex = index; i < 4; i++ ) {try {if (arrIndex-- < 0) {break;}List<Integer> list = map.get(i);if (list.size() < max) {list.add(name + 1);}} catch (Exception e) {}}System.err.println("A:" + map.get(0));System.err.println("B:" + map.get(1));System.err.println("C:" + map.get(2));System.err.println("D:" + map.get(3));System.err.println("-----------------------");if (map.get(map.size()-1).size() == max) {isRunning = false;this.notifyAll();return;} else {index++;}this.notifyAll();}}}public static void main(String[] args) throws InterruptedException {Runnable runable = new MyRunable();for (int i = 0; i < 4; i++) {Thread t = new Thread(runable);t.setName(String.valueOf(i));t.start();}}}



C++ 不过不完整

 1 #include <iostream> 2 #include <stdlib.h> 3 #include <pthread.h> 4 using namespace std; 5  6 pthread_mutex_t myloack=PTHREAD_MUTEX_INITIALIZER; 7 pthread_cond_t mycond=PTHREAD_COND_INITIALIZER; 8 int n=0; 9 void *ThreadFunc(void *arg)10 {11     int num=(int )arg;12     for (int i = 0; i < 10; ++i)13     {14         pthread_mutex_lock(&myloack);15         while (n!=num)//1号线程第一次执行时直接跳过16             pthread_cond_wait(&mycond,&myloack);//因为多个线程共用一个条件变量,所以在田间变量被signal后,需要用while来确定是否本线程获得执行权17 18         if (num==0)19             cout<<"1";20         else if(num==1)21             cout<<"2";22         else if(num==2)23             cout<<"3";24         else 25             cout<<"4"<<endl;26         n=(n+1)%4;27         pthread_mutex_unlock(&myloack);28         pthread_cond_broadcast(&mycond);29     }30     return (void *)0;31 }32 33 int  main(int argc, char const *argv[])34 {35 36     pthread_t id[4];37     for (int i = 0; i < 4; ++i)38     {39         int err=pthread_create(&id[i],NULL,ThreadFunc,(void *)i);40         if (err!=0)41         {42             cout<<"create err:"<<endl;43             exit(-1);44         }45 46     }47 48     for (int i = 0; i < 4; ++i)49     {50         int ret=pthread_join(id[i],NULL);51         if (ret!=0)52         {53             cout<<"join err:"<<endl;54             exit(-1);55         }56     }57     return 0;58 }


0 0
原创粉丝点击