Java 同步与异步的理解
同步: 就是一个人搬砖 必须等另一个人回来了之后再接着另一人来做搬砖的事情 这是同步
同步的例子:
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();
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。