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
的错误???
郁闷中...
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
的错误???
郁闷中...
解决方案 »
- 关于scjp的问题
- 解析xml文,然后入库
- Java和C++很奇怪的一个区别
- ???跪求 jacob 控制word问题 急!!!!
- 请问大家写一个文件互传的程序,两端都用serversocket吗
- 哪里可以下载JCreate?
- 昨天面试题选~~
- 关于SessionBean----50分
- java里如何显示jpg图
- org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.StackOverflowE
- 如果一个类C继承抽象类A同时实现接口B,而抽象类A有非抽象方法out,接口B有抽象方法out...
- 请问这个错误怎么处理?
或者在不同的包里面,加上import