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()方法实现Runnable接口方式和继承Thread方式有什么区别?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(); } }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) { //需要同步的内容 } }在JDK1.5中提供了多线程升级解决方案,将同步synchronized替换成显示的Lock操作public synchronized void sync(){ //同步方法 }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)设置优先级。
Java线程学习和笔记——黑马训练营
最新推荐文章于 2020-04-04 16:38:34 发布
本文详细介绍了Java中线程的两种创建方式、线程生命周期、同步synchronized与死锁概念,以及如何设置线程优先级。通过实例代码演示了如何实现线程并解决同步问题。

381

被折叠的 条评论
为什么被折叠?



