posts - 24,  comments - 38,  trackbacks - 0

  本周主要学习了应用程序的部署和线程的一部分知识,关于应用程序的部署,主要学习了了应用程序的打包,首先学习了在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的优先级别是最高的。

posted on 2017-12-10 20:51 喜欢Java的小菜鸟 阅读(...) 评论(...) 编辑 收藏