-
什么是线程,什么是进程?
根据定义,多任务是当多个进程共享,如CPU处理公共资源。 多线程将多任务的概念扩展到可以将单个应用程序中的特定操作细分为单个线程的应用程序。每个线程可以并行运行。所以一个进程中可以有多个线程。
- 线程的生命周期(有时候说线程的状态)?一般说5个
新线程(New) - 新线程在新的状态下开始其生命周期。直到程序启动线程为止,它保持在这种状态。它也被称为出生线程。
可运行(Runnable) - 新诞生的线程启动后,该线程可以运行。状态的线程被认为正在执行其任务。
等待(Waiting) - 有时,线程会转换到等待状态,而线程等待另一个线程执行任务。 只有当另一个线程发信号通知等待线程才能继续执行时,线程才转回到可运行状态。
定时等待(Timed Waiting) - 可运行的线程可以在指定的时间间隔内进入定时等待状态。 当该时间间隔到期或发生等待的事件时,此状态的线程将转换回可运行状态。
终止(Dead) - 可执行线程在完成任务或以其他方式终止时进入终止状态。
-
线程优先级
每个Java线程都有一个优先级,可以帮助操作系统确定安排线程的顺序。Java线程优先级在MIN_PRIORITY(常数为1)和MAX_PRIORITY(常数为10)之间的范围内。 默认情况下,每个线程都被赋予优先级NORM_PRIORITY(常数为5)。 然而优先并不能真正意义上保证线程的执行顺序,所以并没有什么用?解释一个,比如yield()方法,会退出当前的线程,让步给其它线程,但是有可能CPU又进来了,还是执行它
- java实现多线程的两种方法(据说有第三种,callable接口+线程池的方法,有兴趣的可以自行问度娘)
有一个点一定要注意,java启动线程一定是start()方法而不是run方 法,之前面试遇到过吭,连面试官都忘记了这种基础问题,run()方法是不是可以执行?答案当然是肯定的,但是执行run方法起始就相当于执行普通的方法。
实现Runnable接口,直接上实列
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo( "Thread-1");
R1.start();
RunnableDemo R2 = new RunnableDemo( "Thread-2");
R2.start();
}
}
继承Thread类
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo T1 = new ThreadDemo( "Thread-1");
T1.start();
ThreadDemo T2 = new ThreadDemo( "Thread-2");
T2.start();
}
}
- Java并发常用的方法:
sleep():线程休眠,不会释放锁,单位ms。
wait():线程等待,会释放同步锁。
notify():唤醒指定的线程,继续执行。
notifyAll():唤醒所有的线程,继续执行。
stop():直接停止线程。
isAlive():测试线程是否处于活动状态。
yield():暂停当前正在执行的线程对象,并执行其他线程。
(其它的看API 主要这些,面试问的最多的sleep和wait有什么区别?)
(未完待续Ing)