|
4 | 4 | import burp.IBurpExtenderCallbacks; |
5 | 5 | import burp.IExtensionHelpers; |
6 | 6 | import burp.IHttpRequestResponse; |
7 | | -import domain.DomainProducer; |
8 | 7 |
|
9 | 8 | import java.io.PrintWriter; |
10 | 9 | import java.util.ArrayList; |
| 10 | +import java.util.Collections; |
11 | 11 | import java.util.List; |
12 | 12 |
|
13 | 13 | import GUI.GUIMain; |
14 | 14 |
|
15 | 15 | //////////////////ThreadGetTitle block///////////// |
16 | 16 | //no need to pass BurpExtender object to these class, IBurpExtenderCallbacks object is enough |
17 | | -public class ThreadSearhDomain extends Thread{ |
| 17 | +public class ThreadSearhDomain extends Thread { |
18 | 18 | private List<IHttpRequestResponse> messages; |
19 | | - private List<DomainProducer> plist; |
| 19 | + private final List<DomainProducer> plist = Collections.synchronizedList(new ArrayList<>()); |
20 | 20 |
|
21 | | - private static IBurpExtenderCallbacks callbacks = BurpExtender.getCallbacks();//静态变量,burp插件的逻辑中,是可以保证它被初始化的。; |
| 21 | + private static IBurpExtenderCallbacks callbacks = BurpExtender.getCallbacks();// 静态变量,burp插件的逻辑中,是可以保证它被初始化的。; |
22 | 22 | public PrintWriter stdout; |
23 | 23 | public PrintWriter stderr; |
24 | 24 | public IExtensionHelpers helpers = callbacks.getHelpers(); |
25 | 25 | GUIMain guiMain; |
26 | 26 | private boolean searchThirdPart; |
27 | 27 |
|
28 | | - public ThreadSearhDomain(GUIMain guiMain,List<IHttpRequestResponse> messages,boolean searchThirdPart) { |
| 28 | + public ThreadSearhDomain(GUIMain guiMain, List<IHttpRequestResponse> messages, boolean searchThirdPart) { |
29 | 29 | this.guiMain = guiMain; |
30 | 30 | this.messages = messages; |
31 | 31 | stdout = BurpExtender.getStdout(); |
32 | 32 | stderr = BurpExtender.getStderr(); |
33 | 33 | this.setName(this.toString()); |
34 | 34 | this.searchThirdPart = searchThirdPart; |
35 | 35 | } |
36 | | - |
| 36 | + |
37 | 37 | @Override |
38 | | - public void run(){ |
| 38 | + public void run() { |
39 | 39 | stdout.println("~~~~~~~~~~~~~Start Search Domain~~~~~~~~~~~~~"); |
40 | 40 |
|
41 | 41 | guiMain.getInputQueue().addAll(messages); |
42 | 42 |
|
43 | | - plist = new ArrayList<DomainProducer>(); |
44 | | - |
45 | | - for (int i=0;i<=20;i++) { |
46 | | - DomainProducer p = new DomainProducer(guiMain,guiMain.getInputQueue(),i,searchThirdPart); |
47 | | - p.setDaemon(true); |
48 | | - p.start(); |
| 43 | + for (int i = 0; i <= 20; i++) { |
| 44 | + DomainProducer p = new DomainProducer(guiMain, guiMain.getInputQueue(), i, searchThirdPart); |
49 | 45 | plist.add(p); |
| 46 | + p.start(); |
50 | 47 | } |
51 | | - |
52 | | - try { |
53 | | - for (DomainProducer p:plist) { |
54 | | - p.join(); |
| 48 | + |
| 49 | + for (DomainProducer p : plist) { |
| 50 | + try { |
| 51 | + p.join(1000); |
| 52 | + } catch (InterruptedException e) { |
| 53 | + Thread.currentThread().interrupt(); |
| 54 | + break; |
55 | 55 | } |
56 | | - //让主线程等待各个子线程执行完成,才会结束。 |
57 | | - //https://www.cnblogs.com/zheaven/p/12054044.html |
58 | | - } catch (InterruptedException e) { |
59 | | - stdout.println("force stop received"); |
60 | | - e.printStackTrace(); |
61 | 56 | } |
| 57 | + |
62 | 58 | stdout.println("~~~~~~~~~~~~~Search Domain Done~~~~~~~~~~~~~"); |
63 | 59 | } |
64 | 60 |
|
65 | | - @Deprecated |
66 | | - public void stopThreads() { |
67 | | - for (DomainProducer p:plist) { |
68 | | - p.stopThread(); |
| 61 | + public void stopAll() { |
| 62 | + if (plist == null) |
| 63 | + return; |
| 64 | + |
| 65 | + for (DomainProducer p : plist) { |
| 66 | + p.interrupt();// 必须配合Thread.currentThread().isInterrupted()逻辑,否则不起作用 |
69 | 67 | } |
70 | | - stdout.println("threads stopped!"); |
71 | | - } |
72 | | - |
73 | | - public void forceStopThreads() { |
74 | | - this.interrupt();//将子线程都设置为守护线程,会随着主线程的结束而立即结束,与setDaemon(true)结合 |
75 | | - stdout.println("~~~~~~~~~~~~~force stop main thread,all sub-threads will exit!~~~~~~~~~~~~~"); |
76 | | - } |
77 | 68 |
|
78 | | - // public static void main(String args[]) {//test |
79 | | - // System.out.println(DomainProducer.grepDomain("http://www.jd.com/usr/www.baidu.com/xss.jd.com")); |
80 | | - // } |
| 69 | + for (DomainProducer p : plist) { |
| 70 | + try { |
| 71 | + p.join(1000); |
| 72 | + } catch (InterruptedException e) { |
| 73 | + Thread.currentThread().interrupt(); |
| 74 | + } |
| 75 | + } |
| 76 | + stdout.println("~~~~~~~~~~~~~all sub-threads exit!~~~~~~~~~~~~~"); |
| 77 | + } |
81 | 78 | } |
0 commit comments