同步: 就是一个人搬砖 必须等另一个人回来了之后再接着另一人来做搬砖的事情 这是同步
同步的例子:
public . 修饰名 方法名(){
// 从上往下执行 这是同步
}
异步: 一个人在弄面粉准备做馒头 另一个人在生火准备做馒头 两个人做的事情不同并且互不影响 弄面粉的人也许五分钟弄完 生火的人也许十分钟完成 虽然最终都是为了做成馒头 但是两个人完成一件事情返回的时间是不同的
异步的例子: 另外蛋疼
@Test
public static void test()
{
//.....................1
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//''''''''''''''''''2
final JFrame internetBrowser = new JFrame();
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
internetBrowser.getContentPane().add(NetBrowser.getInstance("www.baidu.com"),
BorderLayout.CENTER);
internetBrowser.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
internetBrowser.setLocationByPlatform(true);
internetBrowser.setAlwaysOnTop(true);
internetBrowser.setUndecorated(true);
internetBrowser.setSize(675,507);
internetBrowser.setUndecorated(true);
internetBrowser.setResizable(false);
internetBrowser.addWindowListener(new WindowAdapter(){
public void windowIconified(WindowEvent e)
{
//..........................3
internetBrowser.setExtendedState(JFrame.ICONIFIED);
}
});
internetBrowser.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
t_Browser=null;
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
internetBrowser.setVisible(true);
t_Browser=internetBrowser;
}
});
}
1 里往下执行是一个线程
2里往下执行又是一个线程 注意 new Runnable() -----------Thread, Runnable等这是新线程的标识
3是2线程中的一部分 3不是新的线程
2里的internetBrowser如果是public static JFrame test(){} 通过1线程来返回 internetBrowser一定是null 因为2可能还没执行完 1与2线程是不同的线程 需要的时间是无法确定的 无法确定1与2谁先执行完 因此要得到internetBrowser的返回值 必须由2线程得到 不能由1线程得到
注意: 摘自JDK API 创建新线程只有两种方法
创建新执行线程有两种方法。一种方法是将类声明为 Thread
的子类。该子类应重写 Thread
类的 run
方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然后,下列代码会创建并启动一个线程:
PrimeThread p = new PrimeThread(143); p.start();
创建线程的另一种方法是声明实现 Runnable
接口的类。该类然后实现 run
方法。然后可以分配该类的实例,在创建 Thread
时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然后,下列代码会创建并启动一个线程:
PrimeRun p = new PrimeRun(143); new Thread(p).start();
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。