内存空间、一组系统资源,每一个进程的内部数据和状态都是完全独立的。
Java程序执行中的单个顺序的流控制称为线程,多线程则指一个进程中可
以同时运行多个不同的线程,执行不同的任务。
2.
java线程分为前台线程(也称用户线程或普通线程)和后台线程(Daemon thread)。
后台线程会随着主线程(main线程)的结束而结束,但是前台进程则不会(如果main线程先于前台进程结束,前台进程仍然会执行);或者说,只要有一个前台线程未退出,进程就不会终止。
默认情况下,程序员创建的线程是用户线程;用setDaemon(true)可以设置线程为后台线程;而用isDaemon( )则可以判断一个线程是前台线程还是后台线程;
jvm的垃圾回收器其实就是一个后台线程;
setDaemon函数必须在start函数之前设定,否则会抛出IllegalThreadStateException异常;
3.
两种
方式一:直接继承线程Thread类。该方法编写简单,可以直接操作线程,由于已经继承了Thread,不能再继承其他类了。
方式二:实现Runnable接口。当一个类已继承了另一个类时,就只能用实现Runnable接口的方式来创建线程;另外,使用此方法的更多原因是多个线程共享某个对象的资源。
4.
创建,就绪, 运行, 阻塞, 死亡。
start(), wait(), sleep(), join(), yield()
5.
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
多线程同时访问共享资源(变量),导致线程安全问题。
采用加锁机制, 加入线程同步的技术。
synchronized 代码块:监视器就是指定的对象。
synchronized 方法:监视器就是this对象。
synchronized 静态方法:监视器就是相应的Class对象。
6.
线程之间需要一些协调通信,来共同完成一件任务。
使用wait和notifyAll实现线程间同步通信 。
7.
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
8.
class Dummy implements Runnable{
private int count = 0;
public void A() {
System.out.println(Thread.currentThread().getName() + " A");
synchronized (this) {
System.out.println(Thread.currentThread().getName() + " A " + count++);
}
}
public synchronized void B() {
System.out.println(Thread.currentThread().getName() + " B " + count++);
}
@Override
public void run() {
while(count < 100) {
A();
B();
}
}
}
public class Test {
public static void main(String[] args) {
Dummy d = new Dummy();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start();
}
}9.
class Dummy_1 implements Runnable {
public static boolean flag = true;
@Override
public void run() {
while(flag) {
System.out.println("i am dummy_1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Dummy_2 implements Runnable {
@Override
public void run() {
Dummy_1.flag = false;
System.out.println("i am dummy_2");
}
}
public class Test {
public static void main(String[] args) {
new Thread(new Dummy_1()).start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new Dummy_2()).start();
System.out.println("main over");
}
}
本文详细介绍了Java中的线程概念,包括线程的创建方式、生命周期、线程安全问题及解决方案、线程间的通信机制以及如何避免死锁等问题。
846

被折叠的 条评论
为什么被折叠?



