java多线程基础知识
来源:互联网 发布:设置截图路径 mac 编辑:程序博客网 时间:2024/06/05 23:55
在不是多线程的情况下,任务是一个一个执行的,然而当我们使用多线程的时候,cpu便允许单个程序创建多个并行执行的线程来完成各自的任务,这样也就可以提高CPU的利用率。来初步认识下java中的多线程:
1、 java中的线程类继承自java.lang.Thread或者其子类,Thread的构造函数有四个:
1、Thread();2、Thread(String name);
3、Thread(Runnable target);
4、Thread(Runnable target,String name);
其中name是线程的名字,target是实现了Runnable接口的对象
2、线程类有以下成员函数:
1、void start(); //启动线程
2、static void sleep(long millis); //线程休眠millis毫秒 ,让给其他任意优先级的线程
3、static void sleep(long millis,int nanos); //millis毫秒naos纳秒线程休眠
4、void join(); //开始当前线程使其他线程停止直到当前线程终止
5、void join(long millis); //开始当前线程使其他线程停止直到当前线程终止或者过去了millis毫秒
6、void join(long millis,int naonos); //同上 只不过其他线程的等待时间变成millis毫秒 naosos纳秒
7、static void yield(); //当前运行线程释放处理器资源,让给其他大于等于自己优先级的线程
8、static Thread currentThread(); //返回当前运行线程的引用
注意:sleep方法和yield方法都会暂停当前线程,但是sleep方法会将资源让给其他线程而不关心它的优先级,但是yield方法则是让给大于等于自己优先级的线程;
sleep方法会将当前线程转入阻塞状态,直到阻塞之后才进入就绪状态,然而yield则是使当前线程直接进入就绪状态;
sleep方法会抛出InterruptedException异常,而yield不会异常;
3、synchronized关键字
synchronized关键字的作用是对一个对象或者是方法(其实还是持有这个方法的对象)加上锁,加锁实质上是取得对象的访问权限,如果对象已经被其他者所加锁,那么请求者就只好进入等待队列(休眠),知道被其他线程使用notify方法唤醒。在被加锁的代码块当中,可能会出现一些情况,使得代码需要一些条件才能继续运行,此时为了让这个代码块能够被其他的线程执行到,必须释放锁,notify方法除了唤醒其他的线程,并把锁交给它之外还有释放锁+让自己休眠的作用。(notify在下面会介绍)
4、同步与互斥的代码实现
public class ThreadTest{ private final Object lockObj=new Object(); //定义一把锁 public void todo(){ synchronized(this){ //java使用synchronized关键字来实现互斥 while(阻塞的条件){ //在这里阻塞的线程都会进入等待队列 try{ lockObj.wait();//条件不满足时都会被阻挡 而不是竞争资源 } catch(InterruptedException e){ e.printStackTrace(); }} //这里写上要进行的互斥代码 ... lockObj.notifyAll();//唤醒所有等待的线程 通知其他线程可以来竞争资源了 }}}注意:wait()/notify()/notifyAll();这些都是Object的成员函数 而不是Thread的成员函数
- Java多线程基础知识
- Java多线程基础知识
- java多线程基础知识
- Java多线程基础知识
- java多线程基础知识1
- Java基础知识:多线程
- Java基础知识:多线程
- Java 基础知识---多线程
- java多线程基础知识总结
- Java基础知识 -- 多线程
- java基础知识---多线程、同步
- Java多线程完整版基础知识
- JAVA多线程基础知识
- java基础知识-多线程
- JAVA多线程 基础知识 001
- Java多线程--基础知识
- Java多线程完整版基础知识
- java多线程基础知识(一)
- 韦东山第12.6节-字符驱动之异步通知
- hdu-6198number number number
- 处理Python2.7读写文件中的中文乱码问题
- MyCat做MySQL读写分离
- String的一些理解
- java多线程基础知识
- 详解:: static_cast与dynamic_cast
- 往有序单循环链表的插入元素使原链表依旧有序
- ASIS CTF 2017 Mary Morton
- iOS原生与H5双向交互总结
- python之tuple与list
- 洛谷 P1522 牛的旅行 Cow Tours
- hdu6201(拆点加最长路)
- jdk的变量的配置