关于java线程的初次了解

来源:互联网 发布:淘宝美工都用什么软件 编辑:程序博客网 时间:2024/05/29 11:52
1.线程的介绍
2.线程的创建
1.继承thread类并且覆写run方法,在主方法中调用start();来开启线程
2.实现java.long.Runnable接口,并且覆写run方法
3.两种方法对比
thread缺点 1.因为java里面是单继承,所以继承了另外一个主类就无法创建多线程。
2.每创建一个thread线程,所拥有的资源是独立的也就是说,每个线程都拥有thread继承类的全部内容。
runnable优点 1可以避免Java中单继承的局限性
2适合多个相同代码程序去处理同一个资源的情况
事实上,大部分的应用都会采用第二种方式来创建多线程,即runanble接口
4.多线程的基本操作方法
1.线程的命名与取得
在线程的操作过程中命名是最重要的,所以在为线程命名的时候不要有重复,也不要有修改
在Thread类里面提供了如下几个方法来进行修改线程的名称
*构造方法:public Thread (runnable target,String name);
Mythread mt=new Mythread(mt,"名称");
Thread onethread=new Thread(mt,"");
onethread.start();
*取得名字:public final String getNaem();
*设置名字:public final void setName(String naem){};
问题是线程的运行状态不确定,所以想要取得线程的名字,只能够取得当前正在执行的线程的名字
那么想要取得当前线程的名字就需要获得当前线程的对象,就必须要依靠Thread类中的 Thread.currentThread().getName()的方法。
如果设置了线程名称线程的名称就是设置的名称,如果没有设置线程名称会自动的进行命名,以保证每个线程都拥有名称
主方法也是一个线程,那么进程在哪里呢?其实进程就是JVM,每当适用java命令来解释一个java类,对于操作系统而言,就是启动了一个进程,而主方法就是进程中的一个线程。
那么每一个JVM启动的时候至少要启动几个线程呢?
至少要启动两个线程一个是主线程,一个是GC垃圾回收线程
2.线程的休眠
线程的休眠就是让线程暂缓执行
操作方式就是Thread.sleep(毫秒);
注意sleep(Long millis)方法声明会抛出异常,因此在调用方法的时候应该捕获该异常,或者声明抛出异常
3.线程的优先级
从理论上来讲,线程的优先级越高,被执行的可能性就越大,但是这仅仅是可能,如果想要进行线程优先级的操作,可以使用如下的两个方法
*取得优先级:对象.getPriority();
*设置优先级:对象.setPriority( int priotity);
对于优先级在Thread类中定义了单个常量
MAX_PRIORITY 表示线程的最高优先级,相当于值10
MIN_PRIOTITY 表示最低优先级,相当于值1
NORM_PRIOTITY 表示中等优先级,相当于值5
那么主线程的优先级是多少呢?
thread.currentThread().getPriotity()发现返回值是5,说明主线程是一个普通优先级的线程
4.线程的让步
5.线程的插队
5.线程的同步与死锁
1.线程的同步
举例一个卖票程序,在加入网络延迟的时候,卖出的票数就会出错,那么出现这个问题的原因很简单,就是在网络延迟的时间里可能出现了另外的一个线程(也就是在进行if语句判断后还没有对生育==剩余票数进行修改的时候,出现了另外一个人进来买票,这样就出现了线程的不同步),也就是会出现负数票数的原因,那么如何来解决这个问题呢?问题的解决的关键就是需要一把锁,而这把“锁”,可以通过两种方式来完成。
1.同步代码块(在使用同步代码块来设置的时候,一定要设置好一个同步对象,同步对象一般使用当前对象this表示)
操作方法:synchronize(this){代码块}或者synchronize(lock)//操作共享代码块,在这个代码块没有执行完毕是不会允许其他线程来进行操作,所以它的性能会变得缓慢,但是安全性提高了,这就是同步处理和异步处理的区别。
2.同步方法
其实和同步代码块相似,在方法前也可以通过synchronize关键字来修饰,被修饰的方法为同步方法,他能实现和同步代码块同样的功能
操作方法:synchronize 返回值类型 方法名 (){};
同步的核心意义:一个线程等待另外一个线程执行完毕。
2.线程的死锁
所谓的死锁就是指的是在线程的同步过程中线程互相等待的过程
结论:在多个线程访问统一资源的的时候,一定要考虑线程的同步,虽然线程会影响程序的性能,但是会提升程序的安全性,但是过多的使用线程的同步,有可能会造成死锁问题(就是两个线程都在互相等待另外一个线程解锁,所以都无法进行下一步的操作)
6.线程的经典案例——生产者和消费者
本案例的核心是由生产者线程,和消费者线程,生产一个物品,消费者取走一个物品,但是很遗憾的是并没有出现我们想要的结果
*数据错位
*数据重复取出与重复设置
1.解决数据错位
使用同步来解决问题——》虽然没有数据的错位但是数据的重复更严重
2.解决数据的重复操作
要想解决数据的重复的操作就需加入等待和唤醒机制
而这样的机制是有Object类提供的,而提供有如下的方法可以使用
*等待wait();
*唤醒第一个final void notify()
*唤醒全程 final void notifyall()谁的优先级高先执行谁
就是在生产车间加入一个指示灯,红灯亮生产一个,绿灯亮取走一个
sleep和wait的区别
sleep()是thread定义的方法在休眠的时候能够自动唤醒
wait()是Object提供的方法在休眠时必须使用notify()或者notifyAll()唤醒
总结: 多线程两种实现方式的区别
同步的概念要搞清楚
知道Object三个提供线程操作的方法


0 0
原创粉丝点击