您的位置:首页 > 编程语言 > Java开发

Java线程学习和笔记——黑马训练营

2015-10-21 15:17 645 查看
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-------

1.关于线程的两种创建方式
1.1、Thread方法
创建线程的第一种方式,继承Thread类
步骤:
1.重写Thread类中的run方法 
2.然后在调用线程的start()方法
3.start()有两个作用:1.启动线程。2.调用run方法
class Demo extends Thread {
private String name;
//构造函数
public Demo(String name){
this.name=name;
}
public void run() {
for (int i = 0; i < 80; i++) {
// 打印线程名称
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
}

public class ThreadText {
public static void main(String[] args) {
//打印主函数线程名称
System.out.println(Thread.currentThread().getName());
// 创建线程
Demo demo1 = new Demo("张三");
Demo demo2 = new Demo("李四");
// 启动线程
demo1.start();
demo2.start();
}
}

1.2、Runnable方法
创建线程的第二种方式:实现Runnable接口
 步骤:
1.定义类实现Runnable接口
2.重写Runnable接口中的run方法
3.通过Thread类建立线程对象
4.将Runnable接口的之类作为实际参数传递给Thread类的构造函数
5.调用Thread类的start()方法启动线程并调用Runnable接口之类的run()方法
class Demo1 implements Runnable{
private String name;
//构造函数
public Demo1(String name){
this.name=name;
}
public void run() {
for (int i = 0; i < 80; i++) {
// 打印线程名称
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}

}
public class RunableText {
public static void main(String[] args) {
//打印主函数线程名称
System.out.println(Thread.currentThread().getName());
Demo1 demo1=new Demo1("王五");
Demo1 demo2=new Demo1("赵四");
//创建Thread线程
Thread t1=new Thread(demo1);
Thread t2=new Thread(demo2);
//启动线程
t1.start();
t2.start();

}
}
实现Runnable接口方式和继承Thread方式有什么区别?
1.实现Runnable接口方式好处:避免了单继承的局限性
 在定义线程时,最好使用实现Runnable接口的方式。
2.实现Runnable接口线程代码存放在接口的之类的run()方法中
 继承Thread线程代码存放在Thread之类的run()方法中  

2.关于线程的生命周期





1.被创建状态:用new Thead类创建一个线程后,该线程处于被创建状态
2.运行状态:当线程对象调用了start()方法后,该线程处于就绪状态
3.冻结(阻塞)状态:当执行了sleep(),wait()后,或等待IO设备等资源,将让出CPU并暂停自己的运行,就处于冻结(阻塞)状态
4.死亡状态:当线程的run()方法执行完,或者被强制终止,那么该线程处于死亡状态。

3.关于多线程的同步synchronized(线程安全)
 多线程同时操作共享数据时,一个线程对多条语句只执行了一部分,还有完成执行完,然而另外一个线程抢占CPU执行权。会导致共享数据的错误。
 根据java API文档中对于多线程安全问题(阻塞状态),可以使用synchronized关键字。
 当代码块用synchronized修辞时,同步代码块保证内部内容只能有一个线程访问。
synchronized同步的使用
public void sync(){
//同步锁的对象为this.
synchronized (this) {
//需要同步的内容
}
}

public synchronized void sync(){
//同步方法
}
在JDK1.5中提供了多线程升级解决方案,将同步synchronized替换成显示的Lock操作
class lockDemo{
//初始化ReentrantLock对象
private Lock lock1=new ReentrantLock();
public void show(){
//获取锁
lock1.lock();
try {
//需要同步的内容
} catch (Exception e) {

}finally{
//释放锁
lock1.unlock();
}
}
}


4.关于多线程的死锁

 产生死锁的原因:当两个线程(使用synchornized关键字时)持有不同的锁,又同时需要访问对方的锁时,双方互不交换锁,就可能导致产生线程的死锁。
synchronized (this) {
synchronized (this) {
//同步嵌套
}
}
当出现同步嵌套的时候,就有可能出现死锁的现象。

5.关于线程优先级
可以通过Thread对象.setPriority(1-10)设置优先级。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: