• 201671010127 2016-2017-17 17周学习总结


      本周主要学习了应用程序的部署和线程的一部分知识,关于应用程序的部署,主要学习了了应用程序的打包,首先学习了在Eclipse下将程序打包成jar文件,接着学习了在DOS命令下将程序打包成jar文件,关于线程,本周只是开了个头,线程是进程在运行过程中的执行走向,线索。线程是比进程更小的一个单位,一个进程可以有一个或多个线程的。java程序启动运行时,就自动产生了一个线程,主函数main就是在这个线程上运行的,当不再产生新的线程时,程序就是单线程。到目前为止我们编写的所有的java程序都是单线程的,接下来我们要学习如何实现多线程的java程序。

    一.线程的实现:

    1、单线程。我们新建一个类Stu1实现一个简单的循环。

    public class Stu1 {

    public static void main(String[] args) {
    //主线程
    for(int i=0;i<10;i++){
    System.out.println("主线程:"+i);
    }
    System.out.println("主线程:死亡");
    }

    }

    运行上面代码,程序只有一个线程,运行完毕程序也就结束了。

    2、通过继承Thread类实现第一个线程。新建一个Thread1类继承Thread类,并重写run方法,run方法就是线程的执行内容。实现代码如下:

    /**
    * 第一种方式
    * 1、继承 Thread
    * 2、重写run方法
    * 3、在主线程中通过start方法启动线程
    * @author Administrator
    *
    */
    public class Thread1 extends Thread{
    //线程体
    public void run(){
    for(int i=0;i<5;i++){
    System.out.println("线程1:"+i);
    }
    System.out.println("线程1:死亡");
    }
    }

    我们要启动这个线程不是调用run()方法,而是使用start()方法启动线程,线程启动后会自动执行run()方法。

    修改上面的Stu1的main方法,启动这个线程。修改如下:

    public static void main(String[] args) {
    Thread1 thread1=new Thread1();
    thread1.start();//通过start启动线程,他会自动执行run方法

    //主线程
    for(int i=0;i<5;i++){
    System.out.println("主线程:"+i);
    }
    System.out.println("主线程:死亡");
    }

    现在你可以再次运行这个段代码,查看后台的输出。你可以多运行几次,我的其中一次的输出如下:

    主线程:0

    线程1:0

    主线程:1

    线程1:1

    主线程:2

    线程1:2

    主线程:3

    线程1:3

    主线程:4

    线程1:4

    主线程:死亡

    线程1:死亡

    由输出可见,主线程和子线程之间是独立运行的,它们将会轮流的占用CPU,而那个线程会占有CPU是由操作系统决定的。所以我们看到多次运行这个程序时,每一次的输出可能都不一样。

    3、通过实现Runnable接口实现线程。为了克服java单继承的限制,java提供了另外一种实现线程类的方式,就是实现Runnable接口,因为接口是可以同时实现多个接口的。同样需要实现run方法。实现代码如下:

    /**
    * 第二种方式
    * 1、实现Ruannable接口
    * 2、实现run方法
    * 3、在主线程通过Thread启动线程
    * @author Administrator
    *
    */
    public class Thread2 implements Runnable{

    @Override
    public void run() {
    for(int i=0;i<5;i++){
    System.out.println("线程2:"+i);
    }
    System.out.println("线程2:死亡");
    }

    }

    启动这个线程也有点区别,你需要new一个Thread类,并把这个实现类作为参数传入这个Thread类,修改Stu1的main方法如下:

    public static void main(String[] args) {

    Thread1 thread1=new Thread1();
    thread1.start();//通过start启动线程,他会自动执行run方法

    //启动另外一个线程,该线程实现了Ruannable接口
    Thread t2=new Thread(new Thread2());
    t2.start();

    //主线程
    for(int i=0;i<10;i++){
    System.out.println("主线程:"+i);
    }
    System.out.println("主线程:死亡");

    }

    再次运行该程序,现在程序共有三个线程,每个线程还是独立的,所以输出的结果感觉也是错乱的。

    4、其他的方法。事实上面我们可以通过setPriority设置优先级别,当然设置优先级别也只是一个给操作系统一个建议,最后谁先占用CPU还是按照操作系统自己的算法。

    另外我们也可以通过sleep()方法让线程休眠,这样他就不会占用CPU了。参考代码如下:

        public static void main(String[] args) {

    Thread1 thread1 = new Thread1();
    thread1.setPriority(10);
    thread1.start();// 通过start启动线程,他会自动执行run方法

    Thread t2 = new Thread(new Thread2());
    t2.start();

    //主线程休眠
    try {
    Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    // 主线程
    for (int i = 0; i < 10; i++) {
    System.out.println("主线程:" + i);
    }
    System.out.println("主线程:死亡");

    }

    运行上面的代码,我们发现主线程的循环要等待两秒后才输出,而线程1的优先级别是最高的。

  • 相关阅读:
    修改Sharepoint 文档库列表点击Excel文件默认跳转到Excel Service服务 xlviewer.aspx页面
    记一次TSQL查询优化 索引的重要性
    使用Uploadify 时,同时使用了jQuery.Validition 验证控件时,在IE11上出现JS缺少对象错误。
    Visual Studio 2015开发Android App问题集锦
    ASP.Net + SQL Server 存储过程实现分页排序
    JotSpot,是什么尤物?(Google收购JotSpot)
    Google创始人之一天才Larry Page呼吁:做研究的人要重视市场营销
    Google Base API - GData 发布
    品尝SPARQL系列之一 SPARQL over HTTP/SOAP -- Joseki引擎的配置和示例程序
    万维网之父Tim BernersLee在美国国会公听会上再谈Web发展的愿景-语义网
  • 原文地址:https://www.cnblogs.com/nbq520/p/8018093.html
Copyright © 2020-2023  润新知