
一 线程与进程的区别?
进程:一个任务就是一个进程。
线程:一个进程中往往有很多的顺序执行流,每个顺序执行流就是一个线程。
优劣:1进程之间不能共享内存,但是线程之间可以共享内存
2 多线程比多进程效率高
3 Java语言内置了多线程功能支持,简化了多线程编程
二 线程的启动与创建
线程对象必须是Thread类或其子类的实例。
创建对象的三种方式:
1继承Thread类创建线程
为什么必须要创建Thread类可以创建线程了?

1 定义Thread类的子类,并重写run()方法,该run()方法代表线程需要完成的任务。run()方法也叫线程执行体
2 创建Thread子类的实例(即创建线程对象)
3 调用线程对象的start()方法来启动该线程。
package ThrowableTest;
public class FirstThread extends Thread {
//1 创建Thread类及其子类,重写run()方法
private int i;
public void run() {
for(;i<100;i++)
System.out.println(getName()+" "+i);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int j=0;j<100;j++)
{
System.out.println(Thread.currentThread().getName());
if(j==30)
{
//创建线程实例并执行
new FirstThread().start();
//创建第二个线程并启动
new FirstThread().start();
}
}
}
}
2 实现Runnable接口创建线程类

1 实现Runnable接口的实现类,并重写Run()方法
2 创建Runnable实现类的实例,并将该实例作为target来创建Thread对象
3启动start()方法
package ThrowableTest;
public class SecondThread implements Runnable {
//1 实现Runnable接口并重写run()方法
private int i;
public void run() {
for(;i<100;i++)
{
System.out.println(Thread.currentThread().getId()+" "+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int j=0;j<100;j++)
{
System.out.println(Thread.currentThread().getName());
if(j==30)
{
//创建Runnable实例,并作为Thread的target来创建Thread对象
SecondThread s1 =new SecondThread();
SecondThread s2=new SecondThread();
new Thread(s1,"xiancheng1").start();//用start()方法启动
new Thread(s2,"xiancheng2").start();
}
}
}
}
3 使用Callable和Future创建线程(暂时不要求,记不住,熟练掌握前面两种方式)
三线程的生命周期

四 控制线程
1 join线程
1 让一个线程等待另一个线程完成的方法——join()方法。当某个程序执行流中调用其他线程join()方法,调用线程将被阻塞,直到被join()加入的join线程执行完毕。
举例:A与B两个进程,A使用join()方法,说明B需要等待A方法执行完成。

2 后台线程
后台线程:专门在后台运行,为其他线程服务。如果所有的前台线程都死亡,后台线程自动死亡。
3 线程睡眠
当前线程调用了sleep()方法之后,会进入Blocking(阻塞状态)。
4 线程让步
让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。
5 线程优先级
每个线程都具有优先级,优先级高的线程获得较多的执行机会,优先级低的程序获得较少的执行机会
6 线程同步
不让多个线程访问相同的数据资源
1 同步代码块
synchronized (obj) {
//此处填写同步代码块
//obj:就是同步监视器
}
2 同步方法
使用synchronized 修饰方法
7 同步锁
Lock控制多个线程对共享资源进行访问的工具。
最常用的是ReentrantLock(可重入锁):使用该Lock对象可以显式地加锁、释放锁。释放锁的放在finally{ //确保在必要时释放锁 }
package ThrowableTest;
import java.util.concurrent.locks.ReentrantLock;
class X
{
//定义锁对象
private final ReentrantLock lock=new ReentrantLock();
//定义需要保证线程安全的方法
public void m()
{
//加锁
lock.lock();
try
{
//需要保证线程安全的代码
//...method body
}
//使用finally块来保证释放锁
finally
{
lock.unlock();
}
}
}
public class ReentrantLockTest {
}
8 死锁
死锁是两个线程(或更多的线程)相互等待对面释放同步监视器时就会发生死锁。
9 线程通信
10线程组
线程组是对一批线程进行分类管理。

ThreadGroup线程组
浙公网安备 33010602011771号