我是這樣寫的代碼:首先,我用螞蟻創(chuàng)建例程池:var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) { AnalyzeCommitDiff(commitDiff.(diffParsedType))})*函數(shù)分析提交Diff() 包含我的antlr_analysis函數(shù)然后我寫了這些:var ( lexerPool *sync.Pool = &sync.Pool{New: func() interface{} { return javaparser.NewJavaLexer(nil) }} parserPool *sync.Pool = &sync.Pool{New: func() interface{} { return javaparser.NewJavaParser(nil) }} newTreeShapeListener *sync.Pool = &sync.Pool{New: func() interface{} { return new(TreeShapeListener) }})func executeJava(diffText string) javaparser.AnalysisInfoType { input := antlr.NewInputStream(diffText) lexer := lexerPool.Get().(*javaparser.JavaLexer) defer lexerPool.Put(lexer) lexer.SetInputStream(input) stream := antlr.NewCommonTokenStream(lexer, 0) p := parserPool.Get().(*javaparser.JavaParser) defer parserPool.Put(p) p.SetTokenStream(stream) //p.AddErrorListener(antlr.NewDiagnosticErrorListener(true)) p.BuildParseTrees = true p.GetInterpreter().SetPredictionMode(antlr.PredictionModeSLL) tree := p.CompilationUnit() listener := newTreeShapeListener.Get().(*TreeShapeListener) defer newTreeShapeListener.Put(listener) antlr.ParseTreeWalkerDefault.Walk(listener, tree) return javaparser.Infos}但顯然存在問題,因?yàn)榫€程不安全。如何使代碼線程安全?誰能給我舉個例子嗎?
1 回答

慕斯709654
TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個贊
線程池不適用于 ANTLR4。出于性能原因,除了一個由解析器或詞法分析器訪問共享 DFA 的位置之外,沒有額外的線程處理。
因此,使用線程的唯一方法是將詞法分析器/解析器實(shí)例關(guān)聯(lián)到線程,并僅從此單個線程訪問該線程。每個解析器實(shí)例使用專用線程,并且永遠(yuǎn)不要在線程之間共享詞法分析器/解析器。
- 1 回答
- 0 關(guān)注
- 85 瀏覽
添加回答
舉報(bào)
0/150
提交
取消