您的位置:首页 > 编程语言 > Java开发

Java多线程基础

2018-03-19 22:38 225 查看
    简单了解一下进程和线程
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.(说白点可以理解为一个java程序,比如你运行了一个简单的helloword 程序那么这个程序就可以说是一个进程)
线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    java实现多线程有三种方式:继承Thread、实现Runnable接口、使用ExecutorService、Callable、Future实现由返回结果的多线程。
线程对象的方法说明
wait()方法,wait(long timeout)
--->锁对象调用wait()方法,让当前线程小a进入等待状态,阻塞住,并让出当先线程拥有的锁。
--->直到其他线程用锁对象调用notifyAll(),notify()将小a从wait虚拟队列中将阻塞的线程唤醒。重新争锁。
--->当别的线程对当前线程小a的对象调用interrupt()方法,则阻塞在wait虚拟队列的线程抛出InterruptedException异常,打算阻塞。
--->wait(longtimeout)进入锁对象虚拟队列的线程在阻塞timeout长时间后,此时已经让出锁,自己自动唤醒,再次争抢锁。

notifyAll()notify()方法
--->notifyAll()方法是将进入锁对象wait队列里所有阻塞的线程唤醒,重新争取锁。
--->notify()方法是将进入所对象wait虚拟队列里的阻塞的线程,拿出一个唤醒。

sleep(long time)
--->当前线程休眠time长时间,并不释放锁。

interrupt()
--->线程对象a.interrupt():将a线程的中断标示位设置成true。
--->线程对象a.isInterrupted():获取a线程的中断标示位的值。
--->Thread.interrupted():返回当前线程的中断标示位的值,同时不管值是什么在返回前将该值设置为false;
--->当线程的中断标示位为true的时候,线程如果在wait().sleep().join()中阻塞时候,或者即将进入的时候,都会抛出InterruptedException异常,从阻塞状态中唤醒,并将状态位设置为false.

join()方法
--->在线程x的线程体中用线程a.join()时,则线程x的线程体就会阻塞到a.join()这句代码这,等待a线程的线程体运行完毕,线程x的线程体的代码才从a.join()这句代码开始往后执行。
--->join(long time):代表线程x会阻塞time秒时间,线程a运行正常,time秒后线程x开始从阻塞位置向下执行代码
--->底层是wait(),不考虑锁。

yeid()方法
--->那个线程调用此方法,那个线程暂时一次让出CPU调度权。至于能否暂停,实际看cpu是否将时间片分给其他的线程。我主动放弃一次,至于cpu走不走,看cpu的。

isAlive()方法
--->线程a.isAlive(),如果线程a的线程体还未执行完,则返回true,如果线程a的线程还未启动,活着线程体已经运行完,则返回false
--->来判断一个线程是否还活着

getstate()方法
--->获取线程的运行状态
--->NEW 新建状态
--->RUNNABLE 运行(可运行)状态
--->BLOCKED     阻塞状态
--->TIMED_WAITING     休眠状态
--->WAITING     等待状态

--->TERMINATED     终止状态

继承thread实现多线程

package com.yanghs.test.thread;

/**
* @author yanghs
* @Description:多线程代码测试
* @date 2018/3/19 19:05
*/
public class TestThread extends Thread {//继承thread并且重写run方法实现你开启线程需要做什么事
public String sleeptime = "0";
@Override
public void run() {
try {
sleep(Long.parseLong(sleeptime));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程名称:"+getName());

}
public static  void main(String[] args){
TestThread t1 = new TestThread();
TestThread t2 = new TestThread();
t2.sleeptime = "1000";
t1.start();
t2.start();
}
}
开启新线程都是调用start()方法,如果调用run方法只是顺序执行这个方法
    2.通过实现Runnable接口实现线程package com.yanghs.test.thread;

/**
* @author yanghs
* @Description:
* @date 2018/3/19 19:36
*/
public class TestRunnable implements Runnable {
public void run() {
//任何时候都能得到线程名称
String name = Thread.currentThread().getName();
System.out.println("当前线程名称:"+name);
}
public static void main(String[] args){
//先建一个线程实例
TestRunnable t1 = new TestRunnable();
//线程启动需要依赖thread类
Thread thread = new Thread(t1);
//启动线程
thread.start();
}
}
    3.使用ExecutorService、Callable、Future实现由返回结果的多线程
    待学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: