Java多线程

多线程 

一、 
进程: 
进程是程序的一次动态执行过程,经历从代码加载、代码执行到执行完毕的一个完整过程。一个应用程序就是一个进程。多进程操作系统能同时运行多个进程(程序),由于CPU具备分时机制,所以每个进程都能循环获得自己的CPU时间片。 

线程: 
每个Java程序都至少有一个线程——主线程。当一个Java程序启动时,JVM会创建主线程,并且在该线程中调用程序的main()方法。 
1、单线程: 
之前接触的都是单线程程序,单线程的特点是,被调用的方法执行完毕后当前方法才可能完成,前一个方法完成后才进行下一个方法。这是一种顺序调用。 
2、多线程: 
当程序同时用多个线程调用不同方法时,并不是像单线程一样的顺序调用,而是启动独立的线程之后立刻返回,各线程运行从run()方法开始,当run()结束后线程运行结束。 
3、线程的优点——并行、省时。 
单核CPU是通过暂停与切换实现多线程的。 

进程与线程的区别: 
(1)一个应用程序就是一个进程,而线程是一个进程内部的多个运行单位。 
(2)多进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源(在同一进程内),在程序内部可以相互调用。 
(3)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担小。 


二、 
每个线程对象都继承了java.lang包中的Thread类,或implements了Runnable接口类。 
线程的启动:start()方法; 
线程的运行:run()方法。 

java多线程的实现 
        1、继承Thread类实现线程。重写Thread类的run()方法
Java代码    收藏代码
  1. public class ThreadDemo extends Thread{  
  2.     //要统计的磁盘路径  
  3.     private String path;  
  4.   
  5.     //构造方法  
  6.     public ThreadDemo(String path){  
  7.         this.path = path;  
  8.     }  
  9.           
  10.     //主方法  
  11.     public static void main(String[] args){  
  12.         //得到根目录  
  13.         File[] root = File.listRoots();  
  14.         for(int i=0;i<root.length;i++){  
  15.             //创建线程对象  
  16.             ThreadDemo td = new ThreadDemo(root[i].getAbsolutePath());  
  17.             td.start();  
  18.         }         
  19.     }  
  20.   
  21.     //重写run方法  
  22.     public void run(){  
  23.         long start = System.currentTimeMillis();  
  24.         System.out.println("开始时间:"+start);  
  25.         int num = countFile(path);  
  26.         long end = System.currentTimeMillis();  
  27.         System.out.println("结束时间:"+end);  
  28.         System.out.println(path+"统计共有"+num+"个文件!");  
  29.     }  
  30.       
  31.     //统计文件数目的方法  
  32.     public int countFile(String path){  
  33.         int count = 0;  
  34.         File file = new File(path);  
  35.         //得到该目录下的所有文件  
  36.         File[] subFile = file.listFiles();  
  37.         //如果该目录为空或  
  38.         if(null==subFile||subFile.length==0){  
  39.             return count;  
  40.         }  
  41.         for(int i=0;i<subFile.length;i++){  
  42.             if(subFile[i].isDirectory()){  
  43.                 count+=countFile(subFile[i].getAbsolutePath());  
  44.             }else if(subFile[i].isFile()){  
  45.                 count++;  
  46.             }  
  47.         }         
  48.         return count;  
  49.     }     
  50. }  
  
      2、实现Runnable接口创建线程 
Runnable接口只有一个run()方法没有start()方法,所以在使用Runnable接口的实现类创建线程时,启动线程要构造一个Thread对象,并调用它的start()方法来启动线程。 
  
        3、使用匿名内部类创建线程 
在实例化Runnable方法时使用匿名内部类重写run()方法。然后再用Thread对象的start()方法启动线程。 

如果run()方法要用到while(true){....}时,会发现CPU的占用率是100%。这时就要让线程隔一段时间暂停一下。在线程运行时,调用一个静态方法sleep(long time),可以让线程暂停time时间后再开始运行,暂停的时间以毫秒计。Thread.sleep(long time)只会让线程暂停(挂起),不是停止也不是退出。当线程在sleep时如果JVM或其他线程强行终止这个线程,sleep方法会抛出线程中断异常InterruptedException,所以需要处理。 


三、 
      使用线程做一个小闹钟。
 
Java代码    收藏代码
  1. /** 
  2.  * 闹钟界面类——每天都会定时响起 
  3.  * @author 客 
  4.  * 
  5.  */  
  6. public class ClockTest extends JFrame implements Runnable{  
  7.     //设置时间格式  
  8.     private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  9.     //设置当前时间为now  
  10.     private String now = "";  
  11.     //设置闹醒时间为alarm  
  12.     private String alarm  = "";  
  13.     //第二个文本框为tf2  
  14.     TextField tf2;    
  15.     /** 
  16.      * 主方法 
  17.      * @param args 
  18.      */  
  19.     public static void main(String[] args){  
  20.         ClockTest clock = new ClockTest();  
  21.         clock.init();  
  22.         //创建线程  
  23.         Thread thread = new Thread(clock);  
  24.         thread.start();  
  25.     }     
  26.     /** 
  27.      * 窗口初始化 
  28.      */  
  29.     public void init(){  
  30.         this.setTitle("闹钟设置");  
  31.         this.setSize(350,200);  
  32.         this.setLocationRelativeTo(null);  
  33.         this.setDefaultCloseOperation(3);  
  34.           
  35.         JPanel south = new JPanel();  
  36.         south.setPreferredSize(new Dimension(350,90));  
  37.         south.setBackground(Color.LIGHT_GRAY);  
  38.         this.add(south,BorderLayout.SOUTH);  
  39.           
  40.         //创建标签,文本框,按钮  
  41.         JLabel label1 = new JLabel("闹醒时间:");  
  42.         final TextField tf1 = new TextField("07:00");  
  43.         JLabel label2 = new JLabel("间隔时间:");  
  44.         tf2 = new TextField("5");  
  45.         JLabel label3 = new JLabel("分钟");  
  46.         JButton btn = new JButton("确定");          
  47.         south.add(label1);  
  48.         south.add(tf1);  
  49.         south.add(label2);  
  50.         south.add(tf2);  
  51.         south.add(label3);  
  52.         south.add(btn);       
  53.         //匿名内部类监听button  
  54.         ActionListener action = new ActionListener(){  
  55.             public void actionPerformed(ActionEvent e) {                  
  56.                 //按钮被点击时,获取tf1中的闹醒时间内容,加入秒钟赋值给字符串alarm(全局变量)  
  57.                 alarm = tf1.getText()+":00";  
  58.             }             
  59.         };  
  60.         //给按钮添加动作监听器  
  61.         btn.addActionListener(action);  
  62.   
  63.         //设置窗体可见  
  64.         this.setVisible(true);  
  65.     }     
  66.       
  67.     /** 
  68.      * 重写run方法,线程运行 
  69.      */  
  70.     public void run(){  
  71.         while(true){//连续不断  
  72.             //创建一个Date对象,  
  73.             Date date = new Date();  
  74.             //以sdf的形式得到时间  
  75.             now = sdf.format(date);  
  76.             repaint();  
  77.                       
  78.             //截取现在时间的后半部分:即时分秒,  
  79.             String now_time = now.substring(1119);  
  80.               
  81.             //输出tf1中记录的时间-时分秒,和现在的时分秒  
  82.             System.out.println("------>now_time"+now_time+"     ----->alarm"+alarm);  
  83.               
  84.             //判断是否相等  
  85.             if(alarm.equals(now_time)){  
  86.                 System.out.println("闹响!");  
  87.   
  88.                 //创建一个Timer对象  
  89.                 Timer timer = new Timer();  
  90.                 //得到tf2中的内容,将其转换成整型  
  91.                 int i = Integer.parseInt(tf2.getText());  
  92.   
  93.                 //创建一个TimerTask的继承子类,调用重写了的run方法  
  94.                 MyTimerTask task = new MyTimerTask();  
  95.                 //调用Timer类中的schedule方法,从相等的时刻开始闹响,每次间隔时间为i分钟  
  96.                 timer.schedule(task, 0, i*60*1000);               
  97.             }         
  98.             try {//线程休息1秒钟  
  99.                 Thread.sleep(1000);  
  100.             } catch (InterruptedException e) {  
  101.                 e.printStackTrace();  
  102.             }  
  103.         }         
  104.     }  
  105.       
  106.     /** 
  107.      * 重绘方法 
  108.      */  
  109.     public void paint(Graphics g){  
  110.         super.paint(g);  
  111.         //绘制当前时间  
  112.         g.drawString(now, 10080);  
  113.     }     
  114. }  

闹钟响起时弹出一个小窗口,可以选择停止不再闹响,或者再睡一会儿再闹响。  
Java代码    收藏代码
  1. /** 
  2.  * 闹钟响起时的类 
  3.  * @author 客 
  4.  * 
  5.  */  
  6. public class MyTimerTask extends TimerTask{  
  7.     AudioClip   mid ;  
  8.     /** 
  9.      * 重写TimerTask的run方法 
  10.      */  
  11.     public void run() {  
  12.         final JFrame jf = new JFrame("闹钟");  
  13.         jf.setSize(20080);  
  14.         jf.setLocationRelativeTo(null);  
  15.         jf.setDefaultCloseOperation(2);  
  16.           
  17.         FlowLayout flow = new FlowLayout();  
  18.         jf.setLayout(flow);  
  19.           
  20.         //创建两个按钮  
  21.         JButton btn_stop = new JButton(" 停  止 ");  
  22.         JButton btn_sleep = new JButton("再睡会儿");      
  23.         jf.add(btn_stop);  
  24.         jf.add(btn_sleep);  
  25.         btn_stop.setActionCommand("stop");  
  26.         btn_sleep.setActionCommand("sleep");          
  27.         //播放音乐  
  28.         String path = "F:\\001.MID";  
  29.         File f = new File(path);  
  30.         try {  
  31.             @SuppressWarnings("deprecation")  
  32.             URL url = f.toURL();  
  33.             mid = java.applet.Applet.newAudioClip(url);// this.getClass().getResource(s));  
  34.             mid.play();  
  35.         } catch (MalformedURLException e1) {  
  36.             e1.printStackTrace();  
  37.         }         
  38.         //匿名内部类给两个按钮添加监听  
  39.         ActionListener a_l = new ActionListener(){  
  40.             public void actionPerformed(ActionEvent e) {  
  41.                 String command = e.getActionCommand();  
  42.                 //如果选择停止,那么终止程序,如果选择睡觉,那么关闭当前窗口,等待下次闹钟  
  43.                 if("stop".equals(command)){  
  44.                     System.out.println("选择停止");  
  45.                     //终止整个程序  
  46.                     System.exit(0);               
  47.                 }  
  48.                 if("sleep".equals(command)){  
  49.                     System.out.println("选择睡觉");  
  50.                     //停止音乐  
  51.                     mid.stop();  
  52.                     //关闭当前小窗口  
  53.                     jf.dispose();                   }             
  54.             }             
  55.         };  
  56.         btn_stop.addActionListener(a_l);  
  57.         btn_sleep.addActionListener(a_l);         
  58.         //设置窗体可见  
  59.         jf.setVisible(true);  
  60.     }  
  61. }  





如有不足欢迎指正!  <script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值