一、了解进程和线程
进程:在多任务系统中,每个独立执行的程序,亦即“正在进行的程序”
线程:一个进程中有包含一个或多个线程,一个线程就是一个程序内部的一条执行线索
-------------------------------------------------------------------------------------------------------------------------
二、单线程与多线程的区别
class ThreadDemo1{
public static void main(String args[])
{
new.testThread().run()//调用testThrea对象run方法,创建多线程调用 Thread类的 star(),此为new.testThread().start()
whie(true)
{ System.out.println("main:"+Thread.currentThread().getName())};//线程类对象,getName线程类对象返回名称
}
}
class TestThread//class TestThread extends Thread 创建多线程
{
public void run()
{
while(true)
{System.out.println(“run:”Thread.currentThread().getName())}
}
}
结论:main方法没有执行,要等run结束才执行。
--------------------------------------------------------------------------------------------------------------------------
三、用Thread类创建线程
改为多线程,上例启动一个新线程: 调用 Thread类的 start()
-------------------------------------------------------------------------------------------------------------------------
四、后台线程与联合线程
如果对某个线程在启动(调用start方法)之前调用了setDaemon(true)方法,这个线程就变成了后台线程
对于JAVA,只要有一个后台线程在运行,这个进程就不会结束,如果只有后台线程运行,这个进程就会结束
pp.join()的作用是把pp所对硬的线程合并到调用pp.join()语句的线程中
------------------------------------------------------------------------------------------------------------------------
五、使用runnable创建线程
上例中:
实现Runnable接口:implements runnable
Thread tt = new thread(new TestThread())
使用Runnable与 Thread的区别
public class ThreadDemo4
{
public static void main(String [] args)
{
ThreadTest tt=new ThreadTest();
tt.start();
tt.start();
tt.start();
tt.start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class ThreadTest implements Runnable //extends Thread 使用Runnable比继承Thread灵活
{
private int tickets=100;
public void run()
{
while(true)
{
if(tickets>0)
System.out.println(Thread.currentThread().getName() + " is saling ticket " + tickets--);
}
}
}
----------------------------------------------------------------------------------------------------------------
六、多线程的同步
暂停: Thread.sleep(时间值)
同步语句块synchronized(可以是任意类型对象)String str = new String("")
都有标志位,0或1. 因为使用synchronized检查监视器,需要额外开销,以牺牲性能为代价。
函数前加synchronized
public synchronized void sale()
同步方法所使用的监视器对象是this!!!
代码块与函数间的同步
public class ThreadDemo6
{
public static void main(String [] args)
{
ThreadTest tt=new ThreadTest();
new Thread(tt).start();//这个线程调用同步代码块
t.str=new String("method");
new Thread(tt).start();//这个线程调用同步函数
}
}
class ThreadTest implements Runnable
{
private int tickets=100;
String str = new String ("");
public void run()
{
if(str.equals("method"))
{
while(true)
{
sale();
}
}
else
{
while(true)
{
synchronized(str)//str 改为this同步监视器是this对象,即可同步
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+ " is saling ticket " + tickets--);
}
}
}
}
}
public synchronized void sale()//同步监视器是this对象
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()+" is saling ticket " + tickets--);
}
}
}
-----------------------------------------------------------------------------------------------------------------------------------
七、死锁
class ThreadTest implements Runnable
{
private int tickets=100;
String str = new String ("");
public void run()
{
if(str.equals("method"))
{
while(true)
{
sale();
}
}
else
{
while(true)
{
synchronized(str)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e){}
synchronized(this){}//等待this
System.out.println(Thread.currentThread().getName()+" is saling ticket " + tickets--);
}
}
}
}
}
public synchronized void sale()
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}catch(Exception e)
{}
synchronized(str){}//dengdaihuode str监视器对象
System.out.println(Thread.currentThread().getName()+ " is saling ticket " + tickets--);
}
}
}
结论:双方都无法等到监视器,出于阻塞状态,发生死锁
---------------------------------------------------------------------------------------------------------------
八、线程间的通信
wait 告诉当前线程放弃监视器并进入睡眠状态直到其它线程进入同一个监视器并调用notify
notify 唤醒同一对象监视器中调用wait的第一个线程
notifyALL:唤醒同一对象监视器中的调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行。
九线程的生命控制
suspend resume stop 方法