extends Thread:
Thread类的start()启动一个新线程。创建一个Thread对象就创建了一个线程。
例new Thread().start();//将启动Thread类中空的run方法。所以线程子类要覆盖掉run。
run方法中的代码运行完成后线程结束。
后台线程:线程对象启动前(start())调用了setDaemon(true)方法。
java只要有前台线程在执行就不会结束。 只有后台线程运行的话java程序就会结束。
join()方法:主线程等待子线程代码完成后再结束。必须抛出异常。其中可带参数,等待时间。
runnable是一个只有run方法的接口。
无论调用多少start方法,创建一个Thread对象就只创建一个线程。
要对一个资源对象创建多线程,实现runnable接口比较容易实现。适合多个相同程序代码线程去处理同一
资源的情况。以后所有情况下请用实现runnable接口编写多线程。
线程的启动与切换。并不是执行到当前语句就转跳运行线程。
在程序中用try{Thread.sleep(1);}catch(Exception e){}之类的语句来模拟偶然发生的某些情况。
线程同步。
synchronzise://还需要查看源代码
public synchronized void sale(){} //其中监视器是this对象
如果要方法与代码块同步,将代码块检查的同步对象设置为this
线程通信。
object类有方法:wait notify notifyAll,必须使用监视器使用的对象。
线程的等待与唤醒Thread t--->synchronized(o)----->o.wait()----->o.notify()。
某类是否为线程安全。
resume() suspend() stop()//过时的方法
Thread类的start()启动一个新线程。创建一个Thread对象就创建了一个线程。
例new Thread().start();//将启动Thread类中空的run方法。所以线程子类要覆盖掉run。
run方法中的代码运行完成后线程结束。
后台线程:线程对象启动前(start())调用了setDaemon(true)方法。
java只要有前台线程在执行就不会结束。 只有后台线程运行的话java程序就会结束。
join()方法:主线程等待子线程代码完成后再结束。必须抛出异常。其中可带参数,等待时间。
runnable是一个只有run方法的接口。
无论调用多少start方法,创建一个Thread对象就只创建一个线程。
要对一个资源对象创建多线程,实现runnable接口比较容易实现。适合多个相同程序代码线程去处理同一
资源的情况。以后所有情况下请用实现runnable接口编写多线程。
线程的启动与切换。并不是执行到当前语句就转跳运行线程。
在程序中用try{Thread.sleep(1);}catch(Exception e){}之类的语句来模拟偶然发生的某些情况。
线程同步。
synchronzise://还需要查看源代码
public synchronized void sale(){} //其中监视器是this对象
如果要方法与代码块同步,将代码块检查的同步对象设置为this
线程通信。
object类有方法:wait notify notifyAll,必须使用监视器使用的对象。
线程的等待与唤醒Thread t--->synchronized(o)----->o.wait()----->o.notify()。
某类是否为线程安全。
resume() suspend() stop()//过时的方法
class Producer implements Runnable
{
Q q;
public Producer(){}
public Producer(Q q){this.q=q;}
int i = 0;
public void run()
{
while(true)
{
/*synchronized(q)
{
if(q.bFull) try{q.wait();}catch(Exception e){}
if(i==0){q.name="zs";
try{Thread.sleep(1);}catch(Exception e){}
q.sex="male";}
else {q.name="L4";q.sex="female";}
i=(i+1)%2;
q.bFull = true;
q.notify();
}
*/
if(i==0)q.put("ZS","male");
else q.put("L4","female");
i=(i+1)%2;
}
}
}
class Consumer implements Runnable
{
Q q;
public Consumer(){}
public Consumer(Q q){this.q=q;}
public void run()
{
while(true)
{
/*synchronized(q)
{
if(!q.bFull) try{q.wait();}catch(Exception e){}
System.out.print(q.name);
System.out.println(":"+q.sex);
q.bFull = false;
q.notify();
}
*/
q.get();
}
}
}
class Q
{
String name = "unkown";
String sex = "unkown";
boolean bFull = false;
public synchronized void put(String name,String sex)
{
if(bFull) try{wait();}catch(Exception e){}
this.name=name;
try{Thread.sleep(10);}catch(Exception e){}
this.sex=sex;
bFull=true;
notify();
}
public synchronized void get()
{
if(!bFull) try{wait();}catch(Exception e){}
System.out.print(name);
System.out.println(":"+sex);
bFull=false;
notify();
}
}
class ThreadCommunication
{
public static void main(String[] args)
{
/*Q q= new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start();*/
ThreadTest tt = new ThreadTest();
new Thread(tt).start();
try{Thread.sleep(1);}catch(Exception e){}
for(int i=0;i<20;i++)
{
if(i>=10)
tt.stopMe();
System.out.println("main is running");
}
}
}
class ThreadTest implements Runnable
{
private boolean bStop = false;
public void stopMe(){bStop = true;}
public void run()
{
while(!bStop)
{
System.out.println(Thread.currentThread().getName()+" is running");
}
}
}