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