Java 多线程,
Java 多线程,
1.java多线程
1.进程:
程序的一次完整运行过程,这个运行的过程之中内存、处理器、IO等资源都要为这个进程进行服务;
2.线程:
1.线程是在进程的基础上进一步划分的;一个进程上同时创建多个线程;
线程的存在离不开进程,进程如果消失了线程也就没了;
Java 中三种多线程的实现方式
java提供了两种实现多线程的途径
1.继承Thread类 重写run()
2.实现Runnable接口实现run()
解决单继承的限制;
2.实现Runable接口
3. 多线程两种实现方式的区别
1.使用Runnable 接口和Thread类型相比,Runnable接口解决了java单继承的限制;
2. Runnable接口可以更好的描述出数据共享(多个线程访问同一资源的操作)
此时 三个线程各自卖自己的票;
这三个线程都直接占用了同一个MyThread1的对象的引用;(这三个线程对象都访问同一个数据资源)
定义结构:(Thread和Runnable的联系)
整个定义结构非常像代理模式,如果是代理模式客户端调用的代理类的方法也应该是接口里提供的方法,那么也应该是run()才对;
3.使用Rummable接口实现的多线程可以避免单继承的局限,但是不能返回操作结果;
从jdk1.5开始 提供了callable 接口
call()方法执行完线程的主题功能之后可以返回一个结果,返回的结果的类型由callable接口上的泛型来决定;
线程中常用方法
1.线程的命名和取得
所有的线程程序的执行,每次都是不同的的运行结果,因为它会根据自己的情况进行资源抢占,如果想要区分每一个线程,就必 须依靠线程的名字;
设置线程的名字:
public Thread(ThreadGroup group, Runnable target)
public final synchronized void setName(String name)
再Runable的子类中可以获取当前执行本方法的线程的名字;
Thread 提供了一个方法取得当前线程对象:
public static native Thread currentThread();
如果没有实例化Thread对象为其取名时,那么会自动进行编号异常;
每当使用java命令去解释一个程序类的时候,对于操作系统而言都相当于启动了一个新的进程;main只是这个新进程中的一个子线程;
每一个jvm进程启动的时候至少启动两个线程;
1.main线程:程序主要执行已经启动子线程;
2.gc线程:负责垃圾回收;
2.线程的休眠
1.让线程的执行速度稍微变慢点; sleep();
public static native void sleep(long millis) throws InterruptedException;
默认情况下,在休眠的时候如果设置了多个线程对象,那么所有的方法将一起进入休眠状态(是因为先后顺序太短,肉眼无法区别,但实际上是有区别的)
3.线程的优先级
越高的优先级,越有可能先执行;
Threda提供了
1.设置优先级
public final void setPriority(int newPriority){}
2.取得优先级
public final int getPriority() {}
最高优先级:
public final static int MAX_PRIORITY = 10;
中等优先级:
public final static int NORM_PRIORITY = 5;
最低优先级:
public final static int MIN_PRIORITY = 1;
线程的同步和死锁
1.线程同步产生的原因;
2.线程的同步处理操作:
3.线程的死锁情况;
1.同步:多个线程访问同一资源的时候需要考虑到的问题;
2.在java中提供了synchronized 关键字;可以通过两种方式实现;
1.同步代码块;
2.同步方法;
java中有四种代码块:普通代码块、构造块、静态块、同步块;
synchronized(锁定对象) {//代码}
public synchronized 返回值 方法名(){//代码}
3.死锁:多个线程相互等待;
多线程操作同一资源需要考虑那些情况,有可能带来哪些问题?
多线程操作统一资源时一定要处理好同步,可以使用同步代码块或同步方法来解决;
但是过多的使用同步,有可能造成死锁;
生产者和消费者的产生
Object类对象多线程的支持
1.生产者和消费者是两个不同的线程类对象,操作统一资源的情况下,具体操作流程
生产者复制生产数据,消费者复制取走数据;
生产者每生产完一组数据之后,消费者就要取走一组数据;
1.数据错位;
同步
2.重复操作;
等待与唤醒机制;Object类提供了专门的处理方法;
等待:wait();
唤醒第一个等待线程;notify()
唤醒所以等待线程,那个优先级高那个先执行;notifyAll();
4.sleep()和wait()的区别;
1.sleep()是Thread类提供的方法;wait()是Object类提供的方法;
2.sleep()可以设置休眠时间,时间一到自动唤醒;wait()需要等待notify()唤醒;
相关文章
- 暂无相关文章
用户点评