找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4963|回复: 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*, 如何实现。   8 a9 ^' X6 j8 {  u9 I/ P0 m" z3 Q, v
- n/ U( S+ A; I4 S- J& H
群里看到的题目,大概做法应该是:1 T2 v6 E4 ?3 q5 _; o7 e! {
一个min heap,key是timestamp,value是thread
: Q% y. T( |: S- n5 Y# K* K! @! q一个hash table,key是thread id,value是对应thread在min heap中的entry,方便随时添加或kill
4 g) S! c1 G! y& m: ~, [: w
0 x0 S' [4 U1 o" k9 a4 y然后就是一个listener thread的了。。。到点就wake up根据min heap最小的time 跟 curtime 比看是否要执行该function。。。当然follow up可以提一下加锁之类的。。。; M' r% J5 R0 z4 l7 R, u
% z$ J+ G+ Y3 S# j8 {* Y) m! I
那么问题来了。。。。这种一个listener thread加一群working thread的程序该怎么写。。。有人能大概写个轮廓么。。。c++或java都行。。。实在不知道怎么下手。。。求大神帮忙- -# f3 @0 T& V8 R* D" E
! G: @1 H" A$ t' g5 ]

, n7 i: N# G3 C

本帖被以下淘专辑推荐:

14

主题

0

精华

70

积分

资深会员

Rank: 2

积分
70
发表于 1-23-2015 06:57 PM | 显示全部楼层
这题用下线程安全的priority queue就行了吧 价格wrapper class 我大致写了下框架 欢迎讨论% B4 g, r7 T2 \; B& o4 v
class mythread {) g9 M1 ?9 D! e4 x
        int time;
3 Y& l" \$ L! r. i1 p2 O- V        Thread t;
; W$ h  v* s! @
: d7 m! G1 H0 b( ]/ C1 F        public mythread(int time, Thread t) {, ?$ `$ e* t2 G, I4 `$ i
                this.t = t;
) N7 u5 g& y, [                this.time = time;
! Z5 I& M7 `# P& M# z% E) Y7 w* E        }
! ]9 b0 _$ }. \+ L+ _/ m$ e) E}
9 V2 ?1 |1 f! I! x
1 z) U8 R8 l& Y" Z6 V0 |- y- Npublic class multi_thread {- K$ l- e3 j$ f; S# f8 V
        PriorityBlockingQueue<mythread> queue = new PriorityBlockingQueue<mythread>(100,5 B; s) S. B, u; A* U* O8 s
                        new Comparator<mythread>() {8 W: b, A; C+ D) _; T) L2 s
                                @Override: X- j' q; l# ^! B$ e% I" Z- N  L+ j
                                public int compare(mythread o1, mythread o2) {7 p( p, k( C- b+ S% T: u
                                        if (o1.time < o2.time)' I: L$ i8 W6 i) l2 ~$ Z5 X5 ~7 N
                                                return -1;
' E" X+ b, M: \* ^' f0 A4 h& o  o                                        else if (o1.time > o2.time)* @6 E# C' d. l; f6 ?7 _
                                                return 1;
% v* [9 U* O# v! F- T; E                                        // TODO Auto-generated method stub2 r/ j& M. ^5 C6 h% s4 f& \  G
                                        return 0;3 S" ?1 K+ S# E' Z$ V! w# S$ h
                                }
9 x8 O; B8 W$ w. f" D3 X0 R- h
- Z9 E" `  ~: e6 X' t  I' n6 d                        });" w' b3 T6 A# y* T8 X: e. K

0 {$ \  v' @4 G- w2 D2 f        public Thread pop() {
( w" x# b3 k3 @; j' A9 m$ R                return queue.poll().t;
) N& H0 J% o8 w+ `* A        }
" r& ]: f' h0 ]2 _, P( Q  A7 i; \" h
        public void add(int time, Thread t) {$ z3 v! Z4 K' P: ?
                mythread newthread = new mythread(time, t);* l. M+ o  a' F, u) H3 ?9 j8 b- N
                queue.add(newthread);
2 S8 V9 C- J3 {  |0 T  l        }
) A5 W. T3 z  y}

18

主题

6

精华

257

积分

高级会员

Rank: 3Rank: 3

积分
257
发表于 1-25-2015 01:18 AM | 显示全部楼层
有人写个c++的版本吗? 不会多线程啊...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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