1.多线程每个线程的时间片都是随机的,也就是说当前线程随时都有可能被其他线程抢占资源,线程的调用次序是随机的 。
public class Thread0 implements Runnable {
int m = 100;//注意M在while里面的情况,放在外面相当于两个窗口卖100张票
public void run() {
//int m = 100; 局部变量,每个线程都共享这个变量 ,相当于每个窗口卖100张票
while (true) {
if (m > 0) {
m--;
System.out.println(m);
} else {
break;
}
}
}
}
2.Thread.sleep(100)暂停某个线程,主要用于防止某个线程一直占用资源。核心是释放资源,因为只有一个cpu,多线程是抢占式的。Sleep只能对自己其作用,只能让自己睡觉,不能调用别的线程的sleep方法,也不能让别人睡觉;sleep可能会抛出InterruptedException异常。Thread.sleep()能够实现交替输出,但只是一个粗略的交替输出,比如,有3个线程的话,只能保证每一段是3个不同的线程,但不能保证每段的线程顺序一样。例如3个线程的结果:
Thread-2
Thread-1
Thread-0
Thread-1
Thread-0
Thread-2
Thread-0
Thread-2
Thread-1
3.同步synchronized(this){},相当于一把锁,使得线程不能交替运行,一次运行完一个线程。但synchronized()会降低系统的性能。实现的两种方式,用法例子:
// 方式一
public void run() {
//int m = 100; 局部变量,每个线程都共享这个变量
synchronized(this){
while (true) {
if (m > 0) {
/*try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
m--;
System.out.println(m);
} else {
break;
}
}
}
}
方式二:
public synchronized void run() {
//int m = 100; 局部变量,每个线程都共享这个变量
synchronized(this){
while (true) {
if (m > 0) {
/*try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
m--;
System.out.println(m);
} else {
break;
}
}
}
}
4.在main方法外直接用this调用方法,this是非静态变量,不能直接调用方法,必须先new一个实例。
// this.run(); //error
//run(); //error
{ this.run();} //相当于一个匿名方法,在产生实例前就存在
/*private String UserName;
public void setUserName(String name){
UserName = name; //默认是 this.UserName,但如果UserName的标识符和局部变量一样,则会出错
}*/
5.Thread.join();Thread.yield();
wait():可以释放锁,可以调用别的Thread的wait方法,和notify成对出现
notify():通知wait()不用再等待了
//异步:asynchronized 线程同时运行 同步:synchronized 同时只能一个线程
6. extends Tread 和 implements Runnable 的区别
只是Thread只能是继承,而Runnable是接口。Java只支持单继承,所以你的类如果还要继承自其它的类,就不能用Thread了,这时可以用runnalbe接口。 Thread是Runnable的实现类。如果你想对它做一些Thread对象才能做的事情(比方说toString( )里面的getName( )),你就必须用Thread.currentThread( )去获取其当前线程。Runnable interface的好处在于,所有东西都属于同一个类;也就是说Runnable能让你创建基类和其它接口的mixin(混合类)。
7. sleep() 和wait()的区别
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。
wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.