一 线程与进程的区别? 

   进程:一个任务就是一个进程。

   线程:一个进程中往往有很多的顺序执行流,每个顺序执行流就是一个线程。

   优劣: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线程组