1.多线程的基本实现。
1.0 进程和线程
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,简单说,一个进程至少包含一个线程。
1.1 线程实现方法,继承thread
* 继承 thread 其实就是实现Runnable接口
*/
public class ExtendsThread extends Thread{
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public void run1(){
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String[] args) {
Thread eThreadone = new ExtendsThread();
Thread eThreadtwo = new ExtendsThread();
eThreadone.run();
eThreadtwo.run();
eThreadone.start();
eThreadtwo.start();
}
}
/* 直接调用本线程的run()方法。和start()区别
* 下面的例子可以看到,调用run()方法,程序是顺序执行的,没有交互式运行
* 而调用start(),可以正常完成交互式运行。
* 在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,
* 可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,
* 这样的技术成为JNI技术(java Native Interface)
* (2)在我们调用run()方法时,执行的是此线程内部的方法,而start()方法重新创建了一个线程
* 因此主线程未能退出,直到线程eThreadone,eThreadtwo也执行完毕.这里要注意,默认创建的线程是用户线程(非守护线程)
*run()可以多次调用,start() 不能多次调用,调用多次会产生:IllegalThreadStateException异常.
调用run()方法,只是执行了当前线程,并没有实现多线程,而调用start()才启动了多线程。
* 守护线程在没有用户线程可服务时自动离开
*
* 在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。
*
* 这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。
*
* 将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。
*
* 典型的守护线程例子是JVM中的系统资源自动回收线程,
*
* 我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,
*
* 当我们的程序中不再有任何运行中的Thread,
*
* 程序就不会再产生垃圾,垃圾回收器也就无事可做,
*
* 所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
*
* 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
*
* 守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
*
* 也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。
*
* 当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;
*
* 如果还有一个或以上的非守护线程则JVM不会退出。
* 守护线程设置
* eThreadone.setDaemon(true);
* 用户线程可以被System.exit(0)强制kill掉; System.exit(0);正常退出,整个虚拟机里的内容都停掉了
* JVM都停掉了。所以内存都释放掉了。 System.exit(1); 1或者非0 表示非正常退出。
* 在一个if-else判断中,如果我们程序是按照我们预想的执行
* ,到最后我们需要停止程序,那么我们使用System.exit(0),而System
* .exit(1)一般放在catch块中,当捕获到异常,需要停止程序
* ,我们使用System.exit(1)。这个status=1是用来表示这个程序是非正常退出。
eThreadone.start();
System.out.println("main thread is over");
System.exit(0);
}
}
1.2 通过runnable 接口实现多线程
public class RunnableThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String[] args) {
RunnableThread rThread = new RunnableThread();
Thread threadone = new Thread(rThread);
Thread threadtwo = new Thread(rThread);
threadone.run(); //在本线程内调用run 方法,可以多次调用
threadone.run();
threadone.start(); //重新启动一个线程调用该线程内的方法,不能多次调用
threadtwo.start();
}
}
/*
* 说明: start()方法重新创建了一个线程,在main方法执行结束后,由于start()方法创建的线程没有运行结束,
* 因此主线程未能退出,直到线程threadone,threadtwo也执行完毕.这里要注意,默认创建的线程是用户线程(非守护线程)
*/
* 说明: start()方法重新创建了一个线程,在main方法执行结束后,由于start()方法创建的线程没有运行结束,
* 因此主线程未能退出,直到线程threadone,threadtwo也执行完毕.这里要注意,默认创建的线程是用户线程(非守护线程)
*/