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();
 

每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。

posted @ 2013-03-13 17:02  IamThat  阅读(478)  评论(0编辑  收藏  举报