2013-03-28 31 views
7

Nếu tôi đang gỡ lỗi một số mã Java đa luồng trong Eclipse - với một lớp chính là RunTest và một lớp QueueListener thú vị.Làm cách nào để loại bỏ Java testrunner trong các điểm ngắt Eclipse?

Giả định:

  • Khi RunTest được khởi tạo - QueueListener chạy ở chế độ nền.
  • Khi RunTest Chốt - QueueListener bị chấm dứt
  • Có một phương pháp duy nhất trong RunTest - với một breakpoint trong nó
  • Có một phương pháp duy nhất trong QueueListener với một breakpoint trong nó
  • QueueListener có thể chạy hơn và hơn một lần nữa
  • RunTest chỉ chạy một lần mỗi thực hiện (lớp cha)

Khi gỡ lỗi trong Eclipse - cả hai breakpoint đi lên. Nhưng Eclipse ưu tiên RunTest - và tôi phải tự lật nó lên QueueListener bằng cách chọn chuỗi đó trong trình gỡ lỗi - và lặp lại nó lặp đi lặp lại.

Có cách nào để nói với Eclipse rằng tôi quan tâm hơn đến QueueListener và xem xét trình thử nghiệm là ưu tiên thấp hơn - khi nó chọn các điểm ngắt gỡ lỗi để hiển thị?

+0

Tôi có thể biết tên của Ứng dụng mà bạn đang gỡ lỗi không? RunTest có được gọi là driverscript trong AutomationFramework không? –

Trả lời

3

Câu trả lời có thể được tìm thấy trong mã nguồn nhật thực trong phương thức ThreadEventHandler. Có một danh sách các chủ đề bị đình chỉ, như sau:

/** 
* Queue of suspended threads to choose from when needing 
* to select a thread when another is resumed. Threads 
* are added in the order they suspend. 
*/ 
private Set fThreadQueue = new LinkedHashSet(); 

Tiếp tục xuống, mỗi khi một breakpoint là hit, thread lơ lửng sẽ được thêm vào hàng đợi này:

protected void handleSuspend(DebugEvent event) { 
    ... 
    queueSuspendedThread(event); 
    ... 
} 

Phương pháp để có được những tiếp theo chỉ bị treo là:

protected synchronized IThread getNextSuspendedThread() { 
    if (!fThreadQueue.isEmpty()) { 
     return (IThread) fThreadQueue.iterator().next(); 
    } 
    return null; 
} 

Vì vậy, câu trả lời là không theo thứ tự mà mỗi chuỗi truy cập điểm ngắt và được thêm vào hàng đợi bên dưới.

+0

Trong thực tế, điều này thực sự có nghĩa là một khi chuỗi RunTest của bạn nằm ở đầu hàng đợi, nó sẽ vẫn ở đó cho đến khi bạn tiếp tục nó, do đó, bằng cách nối lại mỗi QueueListener sau thời điểm này, nó sẽ luôn trở lại luồng RunTest của bạn –

+0

chỉ FIFO - đủ công bằng. Cảm ơn câu trả lời được nghiên cứu kỹ. – hawkeye

0

Không có ưu tiên liên quan, nhưng điều này chỉ phụ thuộc vào hành vi thời gian của ứng dụng của bạn. Có lẽ 2 điểm ngắt của bạn bị trúng trong một khoảng thời gian rất ngắn, nhưng luôn theo thứ tự. Và sau đó nhật thực sẽ luôn luôn mở trình soạn thảo (và cuộn đến chủ đề) của chỉ một trong số chúng (nơi tôi không biết chính xác chiến lược đã chọn, nhưng tôi sẽ đoán điểm ngắt đầu tiên đã xảy ra).

Bạn không thực sự muốn người chỉnh sửa/lượt xem của mình thay đổi mọi lúc khi gỡ lỗi ứng dụng đa luồng và nhấn điểm ngắt sau mỗi vài giây, hay bạn?

Các vấn đề liên quan