司马颙起初继承其父司马瑰的太原王爵位,咸宁二年(276年),前往封国。咸宁三年(277年),改封为河间王。
司马颙少年时有好名声,看轻钱财厚待贤士。与各藩王来朝见时,晋武帝司马炎赞叹司马颙可以作为各藩国的表率。
元康元年(291年)八月初九日,担任北中郎将,镇守邺城。
元康九年(299年)九月,司马颙代替梁王司马肜担任平西将军,镇守关中。 按照当时规定,不是特别亲近的皇族之人不能统率关中,司马颙在各藩王中属于比较疏远的人,因其贤能而被特殊任用。
永康二年(301年),赵王司马伦篡位,齐王司马冏谋划讨伐他。原先的安西参军夏侯奭自称为侍御史,在始平聚合兵众,招得几千人,来响应司马冏,又派信使来邀请司马颙起兵。司马颙派遣主簿房阳、河间国人张方讨伐并擒获了夏侯奭,还有他的同党十几人,在长安闹市腰斩了他们。等到司马冏的檄文传到,司马颙收捕了司马冏的使者,把他送给司马伦。司马伦向司马颙微调兵将,司马颙派张方率领关右强将前往。张方到华阴,司马颙听说二王兵力强盛,便加授长史李含为龙骧将军,兼督护席薳等人追回张方的部队,以此来响应二王。义兵到达潼关,而司马伦、孙秀等已经被杀,晋惠帝司马衷恢复帝位,李含、张方分别率兵回来。等到司马冏论定功劳时,虽然对司马颙初时和自己不同心很气忿,但念及他最终能扶助大事,升任他为侍中、太尉,加三锡之礼。
永宁二年(302年),李含任翊军校尉,因与司马冏的参军皇甫商、司马赵骧等人有怨恨,于是投奔司马颙,假称接受皇帝密诏讨伐司马冏,陈说其利害关系。司马颙接受他的意见,立即发兵,派人邀请成都王司马颖共同举事。任用李含为都督,率领各军驻屯在阴盘,先头部队驻扎在新安,距离洛阳有一百二十里。传送檄文给长沙王司马乂征讨司马冏。待到司马冏失败,司马颙任用李含为河南尹。
太安二年(303年),司马颙让李含与冯荪、卞粹等暗中策划杀害司马乂。皇甫商知道李含此前伪造诏书并与司马颙图谋不轨,全都把知道的情况告诉了司马乂。司马乂便杀了李含等人。司马颙听说李含被杀,立即以讨伐皇甫商为名起兵,派张方任都督,率领精锐兵士七万向洛阳(今河南洛阳)进军。张方攻打皇甫商,皇甫商先抵抗而后溃败,张方便进兵攻打西明门。司马乂率领中军左右卫迎击张方,张方众兵大败,死了五千多人。张方最初在駚水桥西设立军营,在那里修筑数重壁垒,从外地引进军粮,以备足军需。司马乂又跟从晋惠帝出城攻打张方,作战不利。
永兴元年(304年),司马乂被杀,张方返回长安(今陕西西安)。晋惠帝下诏任命司马颙为太宰、大都督、雍州牧。司马颙废掉皇太子司马覃,立成都王司马颖为皇太弟,更改年号,大赦天下。
永兴二年(305年),左卫将军陈眕跟随晋惠帝讨伐司马颖,司马颙又派张方率领两万士兵援救邺城。晋惠帝已到邺城。张方在洛阳屯兵。等到王浚征伐司马颖,司马颖挟持晋惠帝返回洛阳。张方率兵进入宫殿中,逼迫晋惠帝到他的军营,抢掠府库财物,打算焚烧宫殿和太庙来使众人心中绝望。卢志劝说他,他才作罢。张方又逼迫晋惠帝到长安。司马颙于是挑选安排众官,改秦州为定州。待东海王司马越在徐州起兵,到西边迎接晋惠帝时,关中人们大为恐惧,张方对司马颙说:“我所率领的还有十多万兵卒,就奉送晋惠帝回到洛阳宫中,让成都王司马颖返回邺城,你自己留下镇守关中,我向北攻打博陵。这样,天下可以稍微安定,不再有伸手的人。”司马颙考虑事大难成,不同意。于是借给刘乔兵符,升任镇东大将军,派遣司马颖统率楼褒、王阐等各军,据守河桥来抵御司马越。王浚派督护刘根,率领三百名骑兵来到黄河边上。王阐出战,被刘根所杀。司马颖在张方以前的营垒中屯军,范阳王司马虓派鲜卑骑兵与平昌、博陵两地兵众袭击河桥,楼褒向西逃跑,追赶的骑兵到达新安,路上死的人数不胜数。
永兴三年(306年),司马越因为张方劫持迁移晋惠帝,天下人埋怨气愤,首先主张起事并和山东各诸侯限定日期奉迎晋惠帝归来,先派人去劝说司马颙,叫他送晋惠帝回到京都,与司马颙划分陕地而治。司马颙想听从他的建议,但张方不同意。等到东边的军队取得大捷,司马颖等人失败,司马颙才下令张方的亲信将领郅辅夜里斩了张方,送其首级给东来的部队。不久又变卦,改派刁默守卫潼关,却归罪郅辅杀了张方,又斩了郅辅。司马颙的先遣部队将领吕朗等据守荥阳,范阳王司马虓的司马刘琨拿张方的首级给吕朗看,于是吕朗投降。当时东边的军队已很强大,打败刁默入关,司马颙畏惧,又派马瞻、郭伟在霸水抵抗他们,马瞻等战败逃跑。司马颙乘着单马车,逃到太白山。
东边的军队进入长安,晋惠帝返回,以皇太弟的太保梁柳任镇西将军,镇守关中。马瞻等出来到梁柳那里去,趁机就在城内一起杀了梁柳。马瞻等与始平太守梁迈联合,到南山迎请司马颙。司马颙开始不肯入府,长安令苏众、记室督朱永劝司马颙上表谎称梁柳病死,朝中就知道了有关张方的情况。弘农太守裴暠、秦国内史贾龛、安定太守贾疋等人发义兵征讨司马颙,斩了马瞻、梁迈等人。司马越派遣督护麋晃率领本封国的部队讨伐司马颙。到了郑地,司马颙的将领牵秀抵抗麋晃,麋晃斩了牵秀,并杀了他的两个儿子。义军占据了关中,司马颙仅保守孤城而已。
永嘉元年(306年),司马越以诏书征任司马颙为司徒,司马颙于是接受征召赴任。司马越的弟弟南阳王司马模派遣其部将梁臣到新安(今河南渑池东)的雍谷,在车上掐死司马颙,并杀死司马颙的三个儿子。下诏以彭城元王司马植的儿子司马融作为司马颙的继嗣,改封为乐成县王。
司马炎:“颙可以为诸国仪表。”
房玄龄等《晋书》:①“而颙任李含之狙诈,杖张方之陵虐,遂使武闵丧元,长沙授首,逞其无君之志,矜其不义之强。銮驾北巡,异乎有征无战;乘舆西幸,非由望秩观风。若火燎原,犹可扑灭,矧兹安忍,能无及乎!” ②“少有清名,轻财爱士。”
《晋书·卷五十九·列传第二十九》