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