import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;public class ThreadViewer extends JPanel {
private ThreadViewerTableModel tableModel; public ThreadViewer() {
tableModel = new ThreadViewerTableModel(); JTable table = new JTable(tableModel);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); TableColumnModel colModel = table.getColumnModel();
int numColumns = colModel.getColumnCount(); // manually size all but the last column
for ( int i = 0; i < numColumns - 1; i++ ) {
TableColumn col = colModel.getColumn(i); col.sizeWidthToFit();
col.setPreferredWidth(col.getWidth() + 5);
col.setMaxWidth(col.getWidth() + 5);
} JScrollPane sp = new JScrollPane(table); setLayout(new BorderLayout());
add(sp, BorderLayout.CENTER);
} public void dispose() {
tableModel.stopRequest();
} protected void finalize() throws Throwable {
dispose();
} public static JFrame createFramedInstance() {
final ThreadViewer viewer = new ThreadViewer(); final JFrame f = new JFrame("ThreadViewer");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
f.setVisible(false);
f.dispose();
viewer.dispose();
}
}); f.setContentPane(viewer);
f.setSize(500, 300);
f.setVisible(true); return f;
} public static void main(String[] args) {
JFrame f = ThreadViewer.createFramedInstance(); // For this example, exit the VM when the viewer
// frame is closed.
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); // Keep the main thread from exiting by blocking
// on wait() for a notification that never comes.
Object lock = new Object();
synchronized ( lock ) {
try {
lock.wait();
} catch ( InterruptedException x ) {
}
}
}
}
/////////////////////////////////////////////////////////////
import java.awt.*;
import java.lang.reflect.*;
import javax.swing.*;
import javax.swing.table.*;public class ThreadViewerTableModel extends AbstractTableModel {
private Object dataLock; 
private int rowCount;
private Object[][] cellData;
private Object[][] pendingCellData; // the column information remains constant
private final int columnCount;
private final String[] columnName;
private final Class[] columnClass; // self-running object control variables
private Thread internalThread;
private volatile boolean noStopRequested; public ThreadViewerTableModel() {
rowCount = 0;
cellData = new Object[0][0]; // JTable uses this information for the column headers
String[] names = { 
"Priority", "Alive", 
"Daemon", "Interrupted", 
"ThreadGroup", "Thread Name" };
columnName = names;

// JTable uses this information for cell rendering
Class[] classes = { 
Integer.class, Boolean.class, 
Boolean.class, Boolean.class, 
String.class, String.class };
columnClass = classes; columnCount = columnName.length; // used to control concurrent access
dataLock = new Object();  noStopRequested = true;
Runnable r = new Runnable() {
public void run() {
try {
runWork();
} catch ( Exception x ) {
// in case ANY exception slips through
x.printStackTrace(); 
}
}
}; internalThread = new Thread(r, "ThreadViewer");
internalThread.setPriority(Thread.MAX_PRIORITY - 2);
internalThread.setDaemon(true);
internalThread.start();
} private void runWork() { // The run() method of transferPending is called by 
// the event handling thread for safe concurrency.
Runnable transferPending = new Runnable() {
public void run() {
transferPendingCellData(); // Method of AbstractTableModel that 
// causes the table to be updated.
fireTableDataChanged(); 
}
}; while ( noStopRequested ) {
try {
createPendingCellData();
SwingUtilities.invokeAndWait(transferPending);
Thread.sleep(5000);
} catch ( InvocationTargetException tx ) {
tx.printStackTrace();
stopRequest();
} catch ( InterruptedException x ) {
Thread.currentThread().interrupt(); 
}
}
} public void stopRequest() {
noStopRequested = false;
internalThread.interrupt();
} public boolean isAlive() {
return internalThread.isAlive();
} private void createPendingCellData() {
// this method is called by the internal thread
Thread[] thread = findAllThreads();
Object[][] cell = new Object[thread.length][columnCount]; for ( int i = 0; i < thread.length; i++ ) {
Thread t = thread[i];
Object[] rowCell = cell[i]; rowCell[0] = new Integer(t.getPriority());
rowCell[1] = new Boolean(t.isAlive());
rowCell[2] = new Boolean(t.isDaemon());
rowCell[3] = new Boolean(t.isInterrupted());
rowCell[4] = t.getThreadGroup().getName();
rowCell[5] = t.getName();
} synchronized ( dataLock ) {
pendingCellData = cell;
}
} private void transferPendingCellData() {
// this method is called by the event thread
synchronized ( dataLock ) {
cellData = pendingCellData;
rowCount = cellData.length;
}
} public int getRowCount() {
// this method is called by the event thread
return rowCount;
}

public Object getValueAt(int row, int col) {
// this method is called by the event thread
return cellData[row][col];
} public int getColumnCount() {
return columnCount;
} public Class getColumnClass(int columnIdx) {
return columnClass[columnIdx];
} public String getColumnName(int columnIdx) {
return columnName[columnIdx];
} public static Thread[] findAllThreads() {
ThreadGroup group = 
Thread.currentThread().getThreadGroup(); ThreadGroup topGroup = group; // traverse the ThreadGroup tree to the top
while ( group != null ) {
topGroup = group;
group = group.getParent();
} // Create a destination array that is about
// twice as big as needed to be very confident
// that none are clipped.
int estimatedSize = topGroup.activeCount() * 2;
Thread[] slackList = new Thread[estimatedSize]; // Load the thread references into the oversized
// array. The actual number of threads loaded 
// is returned.
int actualSize = topGroup.enumerate(slackList); // copy into a list that is the exact size
Thread[] list = new Thread[actualSize];
System.arraycopy(slackList, 0, list, 0, actualSize); return list;
}
}
这是<<Java线程编程>>上得一段源程序,怎么在JCreator上可以编译通过,但是在JBuilderX上却要有
"ThreadViewer.java": cannot resolve symbol: class ThreadViewerTableModel in class ThreadViewer at line 7, column 17
"ThreadViewer.java": cannot resolve symbol: class ThreadViewerTableModel in class ThreadViewer at line 10, column 34
的错误???
郁闷中...

解决方案 »

  1.   

    加包名,在JB中的习惯是有包名的,就像WEB发布,如果没有包名,类会找不到
      

  2.   

    cyicecream(为了升仙(星)到处UP),能不能给小弟说的明白点.我将上边两个文件放到同一路径下,还要加包名吗??
      

  3.   

    问题还是没有解决呀.郁闷ing.
      

  4.   

    你还是加上package 包名吧。好久不用JBX了。
      

  5.   

    把这几个类都放在一个包里面就可以了。
    或者在不同的包里面,加上import
      

  6.   

    你在JB中new project  ->  new class时向导会帮你加上package的,如果没包名可能绘出现找不到用户定义的类的情况.
      

  7.   

    结贴了,但是我还是有一点不明白为什么在工程中add file(上面两个文件)编译时就不行呢.(加上package 包名(当前两个类所在的目录名) 还是不行).但是如果用向导重新在工程中建立两个类(上面两个)就可以通过编译呢???