JAVA 线程,
分享于 点击 5285 次 点评:110
JAVA 线程,
线程的几种状态
新建状态 (new 线程对象)
运行状态 (调用start方法)
阻塞状态 (等待CPU的执行资源)
休眠状态 (调用sleep(时间)方法)
等待状态 (调用wait方法)
终止状态 (run方法执行完毕)
线程的创建方式 — 匿名内部类
匿名内部类
相当于创建一个该类的子类对象
// 写法:
new 父类名()或接口名{
重写父类或接口中方法
};
这里new出来的 就是这个类的 子类对象
使用匿名内部类的方式创建线程
例1: 将类声明为 Thread 的子类
new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
// 获取当前线程名字 getName()
System.out.println(getName() + "--" + i);
}
};
}.start();
例2: 声明实现 Runnable 接口的类
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
// 获取当前线程名字 Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName() + "--" + i);
}
}
}, "线程2") {
}.start();
线程休眠 — sleep();
让线程让出CPU的资源 — yield()
Thread类 是Runnable接口的实现类
重写接口中的 run方法
该方法没有抛出异常
所以 所有Runnable接口的实现类(包括Thread类)
都不能在run方法中 抛出异常 只能处理
同步锁
锁可以是任意对象 要保证锁的唯一
三个线程使用的是同一把锁
// 写法:
synchronized(对象锁){
}
同步锁的规则:
遇到锁
可以携带锁进去
当线程执行完代码块中的代码
把锁还回去
当线程没有遇到锁的时候
会在同步代码块外等待
例: 卖火车票
// 声明50张票 保证票是共享数据 只New一次该类对象
private int titkes = 50;
// 创建了对象锁 并且保证唯一
private Object obj = new Object();
@Override
public void run() {
while (true) {
// 锁只要保证唯一对对象 填this即可
synchronized (this) {
// 操作的共享数据的代码
if (titkes > 0) {
// 线程休眠一会
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 有票
System.out.println
(Thread.currentThread().getName() + "--" + titkes);
// 打印一次 减少一张
titkes--;
}else {
// 没票 结束循环
break;
}
}
// 让线程让出CPU的资源
Thread.yield();
}
}
死锁: 两个线程在执行过程中 都在等待被对方占用并堵塞的资源
锁
Lock 接口
// 写法:
lock.lock();
try{
写操作共享数据的代码
}finally{
lock.unlock();
}
接口实现创建线程的好处:
1.避免了直接继承Thread类的局限性(避免单继承)
2.接口即插即用 减少类与类之间联系
相关文章
- 暂无相关文章
用户点评