找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3450|回复: 3
收起左侧

[Google] 一道gg多线程面试题求讨论

[复制链接]

4

主题

0

精华

33

积分

新米人

Rank: 1

积分
33
发表于 11-13-2014 08:27 PM | 显示全部楼层 |阅读模式

亲!马上注册或者登录会查看更多内容!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
实现 void Schedule(int64 timestamp, function* to_run) = 0;多个模块会调用这个function*, 如何实现。   6 n: a1 M6 ?6 L: s) U5 I

- f9 w& t, \; z4 x' _8 j群里看到的题目,大概做法应该是:' W' r$ l! q- n0 P
一个min heap,key是timestamp,value是thread
% z! \# p( D2 U% w& P: K# @) p一个hash table,key是thread id,value是对应thread在min heap中的entry,方便随时添加或kill
& L: U( G' C' }, O7 n
% w3 R. R* ?/ [* z, u然后就是一个listener thread的了。。。到点就wake up根据min heap最小的time 跟 curtime 比看是否要执行该function。。。当然follow up可以提一下加锁之类的。。。/ Q3 m7 U  Q( C

2 x# ?/ Y, z; Y) }/ l2 A那么问题来了。。。。这种一个listener thread加一群working thread的程序该怎么写。。。有人能大概写个轮廓么。。。c++或java都行。。。实在不知道怎么下手。。。求大神帮忙- -
; T) t1 G3 e, _7 P& w/ Y; Z; T: n
6 t- J/ W  j6 t9 ]) k

本帖被以下淘专辑推荐:

14

主题

0

精华

70

积分

资深会员

Rank: 2

积分
70
发表于 1-23-2015 06:57 PM | 显示全部楼层
这题用下线程安全的priority queue就行了吧 价格wrapper class 我大致写了下框架 欢迎讨论
/ D, W5 r+ w' A( G3 f6 \; Tclass mythread {& r# w2 p: }  x+ L6 b4 @5 L" ]" N
        int time;- ~9 c# b6 v& n( }( e- d
        Thread t;  x" b  V- u! }* G+ p

+ @% h2 n  {9 D        public mythread(int time, Thread t) {' c1 j  J1 T( G! U
                this.t = t;
- b2 m: W; n: O. S$ H                this.time = time;5 X; o/ ^0 ?+ H( U- Q1 d* b! v2 h
        }; F, z( d, J( H
}$ Y% `% r1 O) a  q

* @! I6 ]6 v  g7 ~public class multi_thread {( b/ b7 C) U7 A+ k/ u8 I0 [
        PriorityBlockingQueue<mythread> queue = new PriorityBlockingQueue<mythread>(100,! r. k: r5 Y, y1 m4 k4 K, z  B. l
                        new Comparator<mythread>() {, L) ]; m0 w8 a% w7 b$ ~
                                @Override0 s* T$ k* k3 e2 M
                                public int compare(mythread o1, mythread o2) {# s2 P$ I. \/ G; a& E
                                        if (o1.time < o2.time)1 `) t8 h5 A5 Q. L" d
                                                return -1;3 ]& X& N) F1 g0 g# ?( ?
                                        else if (o1.time > o2.time)$ m! E- D9 _; n5 i
                                                return 1;" {% _! ^, H" N5 s: M  b
                                        // TODO Auto-generated method stub
9 V4 a' c( b0 }: x7 [! i; f6 c                                        return 0;
% a) E& P- \- {! g  w                                }4 ^8 y5 L5 D/ e% L* _' L; i

/ b( t7 [/ |+ r( k, {% E, P  ]                        });
. A1 C  O1 B2 H) d4 \4 L+ H2 q: \4 H
        public Thread pop() {$ q2 u8 X5 \3 R: F( D+ h& X, p
                return queue.poll().t;% p5 g; F" K9 g0 @+ i# t
        }
- N7 c9 @/ \' _1 b9 r8 H8 R4 l2 L; q; }* S
        public void add(int time, Thread t) {0 ?- j  n5 X" u2 _; Y* k' V
                mythread newthread = new mythread(time, t);
5 P" Z' O$ l0 {) T& s9 c4 e                queue.add(newthread);; Y/ X4 u6 c% d! e* K' A
        }
" [7 ?8 b9 D+ F$ Y1 x  r" ~}
回复 支持 反对

使用道具 举报

18

主题

6

精华

257

积分

高级会员

Rank: 3Rank: 3

积分
257
发表于 1-25-2015 01:18 AM | 显示全部楼层
有人写个c++的版本吗? 不会多线程啊...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表