多线程
类继承Thread类,重写run()方法,run()方法中是线程执行的代码,调用该线程类,使用start()方法,jvm会去调用run方法。
MyT m1=new MyT();
MyT m2=new MyT();
//设置线程名称
m1.setName("飞机");
m2.setName("高铁");
m1.start();
m2.start();
-----------------
//线程类中输出getName方法会输出该线程名称
[MyT]
sout(getName+i);
-----------------------------
线程优先级
getPriority();获取线程优先级,默认为5
setPriority();设置线程优先级。最高为10,最低为1
线程优先级高表示线程获取cpu时间片的概率高,并不一定优先级高的线程执行完才执行优先级低的线程。
线程控制
sleep(long millis);使当前正在执行的线程停留指定的毫秒数
join();等等这个线程死亡.(此线程执行完毕才会执行别的线程)
void setDaemon(boolean on);将此线程标记为守护线程,当运行的线程都是守护线程时,jvm将退出。(主要线程运行完毕,守护线程就没有存在的必要了)
Runnable接口
避免了java单继承的局限性。
适合多个相同程序的代码去处理同一个资源的情况。
使用接口方式,获取线程名称需要用Thread.currentThread().getName();
附加:接口的成员特点。接口中的成员变量默认修饰为public static final
接口不能有构造方法
Myrunnable m=new Myrunnable();
Thread t1=new Thread(m);//创建线程
Thread t2=new Thread(m,"飞机");//创建线程并指定线程名字
t1.start();
t2.start();
同步代码块
锁多条语句操作共享数据,可以使用同步代码块实现
解决了多线程的数据安全问题,但当线程很多时,因为每个线程都会区判断同步上的锁,这是很耗费资源的,会降低程序 的运行效率
private Object obj=new Object();
synchronized(obj){
if(tickets>0){
...
}
}
同步方法
将synchronized关键字加到方法上,锁对象是this本身
private synchronized void sellTicket(){
}
同步静态方法
将synchronized,static关键字加到方法上,锁对象是类名.class
private static synchronized void sellTicket(){
}