1…线程间通信
线程间通信:同一堆数据,一个线程在往里面存数据一个线程在取数据,他们同时进行,这2个线程运行代码不一样,动作不一致就代表着有2个run方法来存放运行代码,2个run方法在2个类当中
线程间通讯:
其实就是多个线程在操作同一个资源,
但是操作的动作不同。
class Res
{
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}catch(Exception e){}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void out()
{
if(!flag)
try{this.wait();}catch(Exception e){}
System.out.println(name+"........"+sex);
flag = false;
this.notify();
}
}
class Input implements Runnable
{
private Res r ;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
if(x==0)
r.set("mike","man");
else
r.set("丽丽","女女女女女");
x = (x+1)%2;
}
}
}
class Output implements Runnable
{
private Res r ;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.out();
}
}
}
class InputOutputDemo2
{
public static void main(String[] args)
{
Res r = new Res();
new Thread(new Input(r)).start();
new Thread(new Output(r)).start();
}
}
2…停止线程
stop方法已经过时。
如何停止线程?
只有一种,run方法结束。线程要运行的代码没有了线程就结束
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,也就是线程结束。
特殊情况:
当线程处于了冻结状态。
就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();对冻结状态进行清除,强制让线程恢复到运行状态中来
3…守护线程
Thread
类的setDaemon(boolean on)
将该线程标记为守护线程或用户线程。
public final voidsetDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。
守护线程就是后台线程..我所看到的线程都是前台线程,当你把某些线程标记为后台线程后他就具备了个特殊的含义
后台线程的特点:后台线程开启后和前台线程共同抢劫cpu的执行权运行,,后台线程和前台线程开启运行都没区别,就是结束有区别,当所有的前台线程都结束后,后台线程会自动结束,,他们可以一起运行
守护线程应用:有一线程依赖于另外一个线程,另外一个线程如果不运行了那么那个被依赖的线程存在是没有意义的,,比如输入线程不输入了输出线程就可以不用输出了
为什么要守护呢:前台线程结束了的话那么后台线程也就结束了,,守护线程跟着前台线程跑,前台线程一结束那么守护线程存在就没有意义了
4…线程join方法
Thread方法:
join(long millis,int nanos)
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
用处:当我们进行多线程运算的时候,一个线程在运算过程中如果满足一条件的话我们可以临时加入一个线程,让这个临时进程运算完,然后另外一个线程再继续运行
join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。
join可以用来临时加入线程执行。
5…线程优先级
线程组;谁开启你的你就属于谁的组,,主线程开启t1t2,所以他们属于main组
优先级;优先级代表着抢资源抢执行权的频率,就是贴标签,谁的优先级高,cpu就多执行谁几次,就是cpu操作他的频率会高些
setPriority(intnewPriority) 设置优先级,,所有的线程包括主线程默认优先级是5,,优先级级数是1-10,,在这10个级数里面只有1,5,10最明显.跨度最大
更改线程的优先级。
static intMAX_PRIORITY 10
线程可以具有的最高优先级。
static intMIN_PRIORITY 1
线程可以具有的最低优先级。
static intNORM_PRIORITY 5
分配给线程的默认优先级。