Java学习笔记:
线程:java语言里的一种特殊功能,进程执行时会分配线程,线程独立执行。需要多条路径切换CPU执行。
使用线程是因为两个进程可以独立执行,不相互影响。
创建线程的第一种方式:继承Thread。(父子关系)
Demo t1 =new demo();
t1.start;
第二种方式:实现Runnable。(不影响类继承其他类),接口为了实现扩展功能。
使用的特点:一个类已经继承了其他的类。可以采用实现的方法创建进程任务。
Demo t3 = new demo(); 创建任务。
Thread t1 = new Thread(t3); 创建线程。
t1.start; 启动线程。
创建Runnable类对象
使用Thread(线程)创建对象,将对象传递给线程。
1, 定义类的实现Runnable 接口
2,覆盖接口Thread 类创建线程对象,并将线程的任务代码封装到run方法中。
3,通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递:因为线程的任务都封装在Runnable 接口子类对象的run方法中。
所以要在线程对象创建时就必须明确要运行的任务。
4,调用线程对象的static 方法开启线程。
(Thread通过实现Runable 来实现线程)
(将线程任务单独封装成对象)
继承Thread 类,会变成Thread的实例,会继承所有的方法。
实现Runnbale 方法,仅仅是将线程的任务进行对象的封装。
线程开启必须有方法:继承,实现接口对象传递
实现Runnable 的方式好处:
1,将线程的任务从线程的子类中分离出来,进行了单独的封装。
按照面向对象的思想将任务封装成对象。
2,避免了java 单继承的局限性。
所以线程问题以后使用 Runnable 做。
买票问题使用多线程实现:
可以用静态static 共用数据解决问题。勉强。
用Runnable 封装票数,
线程安全问题出现的情况:
1,多个线程使用共用数据时
2,操作共享数据的线程代码
当一个线程在执行操作共享数据的多条代码的过程中,其他线程参与了运算。就会导致线程的安全问题。
解决思路:
就是将多条操作共享数据的线程封装起来,在有线程在执行这些代码的时候,其他线程是不可以参与运算的。
Synchronized :同步代码块:
Synchronize(对象)
{
需要被同步的代码;
}
同步的好处和弊端:
解决了线程的安全问题。
效率有一点点低。因为同步外的线程都会判断同步锁。
同步的使用前提:多线程才使用同步,多线程使用的为同一个锁才使用。
同步代码块:同步代码块的锁是任意的。
同步函数:主线程开启线程后,占用CPU,执行完语句。同步函数使用的锁是当前的对象 this。
两个线程独立执行。
所以同步问题建议使用同步代码块。
静态的同步函数使用的锁是 该函数所属字节码文件对象。
可以用getClass 方法获取,也可以当前 类名.class 表示。
单例:多线程下的单例
饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。
本文介绍了Java中创建线程的两种主要方法:继承Thread类和实现Runnable接口,并讨论了这两种方法的区别及适用场景。此外,还探讨了线程安全问题及其解决方案——使用synchronized关键字实现同步代码块。

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



