标签:死循环 tac 决定 优先级 obj 设置 script 队列 while
线程的状态(Thread的State类):
代码示例:start()方法会新建线程并调用run()方法!
Thread t = new Thread();
t.start();
注意以下代码:这段代码也可以编译执行,但不能新建一个线程,而是在当前线程中调用run()方法。(PS:就是作为一个普通方法来调用)
Thread t = new Thread();
t.run();
不能用run()来开启线程,它只会在当前线程中串行执行run()方法。
另外,Thread类有一个非常重要的构造方法:
public Thread(Runnable target)
这个构造方法在start()调用时,新线程会执行Runnable.run()方法。实际上,默认的Thread.run()也是这样子做的。
public class MyThread implements Runnable {
public static void main(String[] args) {
Thread t = new Thread(new MyThread());
t.start();
}
@Override
public void run() {
System.out.println("开启新线程执行run()方法");
}
}
JAVA提供了一个stop()方法来关闭线程,不过这是一个被标注为废弃的方法。原因是stop()方法太过暴力,强行将执行到一半的线程关闭可能导致一些数据不一致的问题。
一帮情况下,不要使用 stop() 方法!
解决方法:定义一个标记变量stopme
,用于指示线程是否需要退出。
在JAVA中,为了完善线程安全退出,有一种重要的线程协作机制————线程中断。(注意:线程中断会给线程发送一个通知,但线程接到通知后如何处理,则由目标线程自行决定)
public void Thread.interrupt() //中断线程
public boolean Thread.isInterrupted() //判断线程是否被中断
public static boolean Thread.interrupted() //判断线程是否被中断,并清除当前中断状态
Thread.interrupt()
方法中断,线程不会立刻停下来,比如死循环体。可以通过isInterrupted()
方法来判断是否跳出循环体。Thread.sleep()
让当前线程休眠若干时间,其签名如下:
public static native void sleep(long millis) throws InterruptedException
Thread.wait()与notify()
这两个方法是配套的,一个线程调用obj.wait()
处于等待状态,需要其他线程调用obj.notify()
来唤醒。obj对象就是多个线程间有效通信手段。
InterruptedException
异常。suspengd()与resume()
前者是线程挂起,后者是继续执行,这是一对互相配合的方法。这两个也是已经被废弃的方法,了解一下就行了。
Runnable
,这会严重影响到我们对于系统当前状态的判断。(不可饶恕)join()与yield()
join() 方法
其签名如下:
public final void join() throws InterruptedException;
public final void join(long millis) throws InterruptedException;
第一个方法表示无限等待;第二个方法表示一定时间的等待。join()方法会阻塞当前线程,直到目标线程结束,或者到达阻塞时间。
同时,join()方法的本质是让在当前线程对象实例上调用线程的wait()方法。
yield() 方法
其签名如下:
public static native void yield();
这个静态方法会使当前线程让出CPU。(PS:但还是会进行CPU资源的抢夺)
当某个线程不是那么重要,或者优先级别较低,可以在适当时候调用 Thread.yield(),给予其他重要线程更多工作机会。
简单建立一个线程组(代码来源于《实战Java高并发程序设计》书中)
public class MyThread implements Runnable {
public static void main(String[] args) {
//创建一个叫"PrintGroup"的线程组
ThreadGroup tg = new ThreadGroup("PrintGroup");
Thread t1 = new Thread(tg, new MyThread(), "T1"); //加入线程组
Thread t2 = new Thread(tg, new MyThread(), "T2");
t1.start();
t2.start();
//由于线程是动态的,activeCount()获得活动线程总数的估算值
System.out.println("活动线程总数 = " + tg.activeCount());
//打印出线程组的线程信息
tg.list();
//注意这个方法与Thread.stop()方法遇到问题一样
tg.stop();
}
@Override
public void run() {
String groupAndName = Thread.currentThread().getThreadGroup().getName()
+ "---" + Thread.currentThread().getName();
while (true) {
System.out.println("I am " + groupAndName);
try {
Thread.sleep(3000);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
守护线程,是系统的守护者,在后台完成系统性的服务,比如垃圾回收线程、JIT线程等。当一个Java应用内只有守护线程时,Java虚拟机就会自然退出。
将线程设置为守护线程:
Thread t = new Thread(new MyThread());
t.setDaemon(true);
t.start();
注意:设置守护线程必须在线程start()之前设置,否则会得到一个IllegalThreadStateException
,但程序和线程依然可以正常执行,只是线程被当作用户线程而已。
Java中线程可以有自己的优先级。由于线程的优先级调度和底层操作系统有密切关系,在各个平台表现不一,无法精准控制。
在Java中,使用 1 到 10 表示线程优先级。一般可以使用三个内置的静态标量表示:
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
PS:数字越大,优先级越高(一般情况)。
synchronized 关键字用法简单记录:
synchronized 可以保证线程间的原子性、可见性和有序性(被 synchronized 限制的多个线程是串行执行的)。
Integer i; i++
的本质是创建一个新的Integer对象,并将引用赋值给i,同时这里涉及到Integer引用的特性)标签:死循环 tac 决定 优先级 obj 设置 script 队列 while
原文地址:http://blog.csdn.net/u011244202/article/details/68252389