两种方法实现多线程
方法1. 继承Thread类,并重写其中的run方法。
public class A extends Thread{
long minPrime;
A(long minPrime)
{ this.minPrime = minPrime; }
public void run(){
...
Thread.sleep(50);
}
}
使用时新建一个实例,调用其start方法(调用start时JVM会自动调用run方法)
A a =new A(143);
a.start();
方法2. 实现Runnable接口,并实现run方法
public class B implements Runnable{
long minPrime;
public B(long minPrime){
this.minPrime = minPrime;
}
public void run(){
...
}
}
使用时新建一个实例,用这个实例新建一个Thread对象,之后调用start方法。
B b= new B(143);
new Thread(b).start();
Thread 和 Runnable 的区别:
其实Thread也是实现Runnable接口的,其实Thread中的run 方法调用的是 Runnable接口的run方法,这种操作模式其实是代理模式。
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
使用join()的线程执行完毕后才执行其他线程。在一定程度上,可以实现同步的功能。用法:
ThreadA t=new ThreadA();
t.start();
try{
t.join()
}
catch(InterruptedException e){}
sleep()和yield()的区别 (用法: Thread.sleep(50); Thread.yield())
1) sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
2) sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。
在JAVA中每次执行程序时至少启动2个线程。一个是main 线程,一个是垃圾回收线程。因为每当用JAVA命令行运行一个程序时,都会启动一个JVM,实际相当于在操作系统中新建一个JVM进程。
守护线程
setDaemon(boolean)方法设置一个线程为守护线程。守护线程在没有用户线程时会自动离开。
优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。
example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。
例子程序:
thread = new Thread(this);
thread.setDaemon(true);
thread.start();
当java虚拟机中没有非守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底 会出现什么问题。
Thread 方法
以下是在 Thread 类中可以获得的重要方法的列表。
SN | 接口描述 |
1 |
Methods with Description 在一个独立的执行路径中开始一个线程,然后在这个 Thread 对象上调用 run() 方法。 |
2 |
public void run() 如果这个 Thread 对象是使用一个单独的 Runnable 目标实例化的,run()方法被 Runnable 对象调用。 |
3 |
public final void setName(String name) 改变 Thread 对象的名字。也有一个 getName()方法来检索名字。 |
4 |
public final void setPriority(int priority) 设置 Thread 对象的优先级。可能的值在 1 到 10 之间。 |
5 |
public final void setDaemon(boolean on) 一个真值将这个线程标志为守护进程。 |
6 |
public final void join(long millisec) 当前进程在第二个线程上调用这个方法,使得当前进程阻塞直到第二个线程终结或者指定的毫秒数过去。 |
7 |
public void interrupt() 中断这个进程,如果由于任何原因而阻塞,使得它也继续执行。 |
8 |
public final boolean isAlive() 如果线程是活的,返回真值,可在线程已经开始但在运行到完成之前的任何时间。 |
以前的方法是被一个特殊的 Thread 对象调用的。以下在 Thread 类中的方法是静态的。调用静态方法会在当前运行的线程上执行操作。
SN | 接口描述 |
1 |
public static void yield() 使得当前正在运行的线程让步于任何其他相同优先级的正在等待调度的线程。 |
2 |
public static void sleep(long millisec) 使当前运行的线程阻塞至少指定的毫秒数。 |
3 |
public static boolean holdsLock(Object x) 如果当前线程持有给定对象的锁,返回真值。 |
4 |
public static Thread currentThread() 返回对当前运行的线程的引用,也就是调用这个方法的线程。 |
5 |
public static void dumpStack() 为当前运行的线程打印堆栈跟踪,这在当调试多线程应用程序时是有用的。 |
java 多线程
原文:http://www.cnblogs.com/CarrieCui/p/5119607.html