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

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

    I'm falling off the sky all alone.The courage inside is gonna break the fall. Nothing can dim my light within. I am That I am 程序 = 数据结构 + 算法
  • 相关阅读:
    你可能不知道的 Laravel Eloquent 小技巧
    Intervention/image 对 Laravel 项目中的图片进行处理
    phpspider简单快速上手的php爬虫框架
    laravel job 与 event 的区别
    laravel 存储配置 Redis 多个库选择
    【XSS技巧拓展】————28、The Shortest Reflected XSS Attack Possible
    【XSS技巧拓展】————27、Avoiding XSS Detection
    【XSS技巧拓展】————26、File Upload XSS
    66、Redis 未授权访问配合 SSH key 文件利用分析
    【XSS技巧拓展】————25、Transcending Context-Based Filters
  • 原文地址:https://www.cnblogs.com/IamThat/p/2957957.html
Copyright © 2020-2023  润新知