最近学了一点java,悔不当初啊。大学都上完了,才开始学java。疑惑之处:创建线程有两种方法:1是集成 Thread(),2是实现Runnable接口。都要重写run()方法。
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
public void run() {
System.out.println("flag=" + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
td1是基于TestDeadLock类创建的对象的引用。存在于栈内存里,指向堆内存的对象。
Thread t1=new Thread(td1);这里我没有理解很清楚。t1是个线程,也就是一个运行的过程,执行的是run()方法。/×以后理解正确率在修改。疑惑之处。
11章错误记录
先上程序
import java.awt.*;
import java.awt.event.*;
public class TFMath{
public static void main(String[] args){
//TFFrame tf=new TFFrame();
//tf.launchFrame();
new TFFrame().launchFrame();
}
}
class TFFrame extends Frame{
TextField num1,num2,num3;
public void launchFrame(){
/* TextField*/num1=new TextField(10);
/* TextField*/num2=new TextField(10);
/* TextField*/num3=new TextField(15);
Label lbPlus=new Label("+");
Button btnEqual=new Button("=");
btnEqual.addActionListener(new MyMonitor(this));
setLayout(new FlowLayout());
add(num1);
add(lbPlus);
add(num2);
add(btnEqual);
add(num3);
pack();
setVisible(true);
}
}
class MyMonitor implements ActionListener{
TFFrame tf=null;
public MyMonitor(TFFrame tf){
this.tf=tf;
}
public void actionPerformed(ActionEvent e){
int n1=Integer.parseInt(tf.num1.getText());
int n2=Integer.parseInt(tf.num2.getText());
tf.num3.setText(""+(n1+n2));
}
}
注意18 19 20行已经声明为成员变量。如果再次声明,编译不会出错,运行时候就会出错。