Java基础回顾之——多线程1
2018-02-26 22:43
162 查看
如果程序每次只能做一件事情,未免为太单调,所以,java中引入了多线程,能让程序同时处理很多事情。例如,当我们发起一次网络请求的时候。如果网速慢,服务器有可能不会立刻给我们返回数据,这时候,如果不放在子线程中去处理,则会导致主线程被阻塞,从未影响软件的正常使用。下面,开始回顾java中的多线程相关知识点。
新建一个类,继承Thread,然后重写父类中的run()方法。在run()方法中写具体的实现功能,如下:
public class YyqThread extends Thread{
@Override
public void run() {
//具体处理的逻辑
}
}
启动这个线程也很简单,new出YyqThread的示例,然后调用它的start()方法。 YyqThread yyqThread = new YyqThread();
yyqThread.start(); 1.2实现Runnable接口的方式 相比第一种方法,减少耦合度。这种方式的定义以及启动如下: public class ImpleThread implements Runnable{
@Override
public void run() {
//具体处理的逻辑
1.3不用实现Runnable接口,可以采用匿名内部内的方法
出生状态:当线程被new出来的时候,就是刚创建的时候;
就绪状态:当调用start()方法之后;
运行状态:当线程得到系统资源后;
等待状态:当线程处于运行状态中,调用wait()方法后;当进入等待状态的线程,只有调用Thread的notify()方法才会被唤醒;
休眠状态:当调用sleep()方法之后;
阻塞状态:当线程在运行状态时,发出输入/输出请求的时候,进入阻塞状态,等待输入/输出结束之后,线程进入就绪状态;
死亡状态:让run()方法执行完毕,线程进入死亡状态。
调用sleep()方法,指定的参数表示休眠的时间,单位为毫秒
3.2线程的join()方法
两个线程A 和 B,当需要B线程执行完毕之后,才能执行A线程,就可以在A线程中用ThreadB.join()方法。
Demo以及结果:public class ThreadJoin {
//线程A的定义
Thread threadA = new Thread( new ThreadA());
public class ThreadA impl
4000
ements Runnable{
@Override
public void run() {
System.out.println("I am ThreadA, waiting for ThreadB finished....");
try {
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I am ThreadA, ThreadB has finished!");
}
}
//线程B的定义
Thread threadB = new Thread( new ThreadB());
public class ThreadB implements Runnable{
@Override
public void run() {
System.out.println("ThreadB is running....");
}
}
public static void main(String[] args) {
ThreadJoin threadJoin = new ThreadJoin();
threadJoin.threadA.start();
threadJoin.threadB.start();
}
}
运行结果:
I am ThreadA, waiting for ThreadB finished....
ThreadB is running....
I am ThreadA, ThreadB has finished!
可以看出,当在线程A中调用线程B的join方法,确实会等待B线程执行完毕之后,才会继续执行A线程。
3.2线程的中断
注意:stop()方法是可以由一个线程去停止另外一个线程,线程A调用线程B的stop方法去停止线程B,调用这个方法的时候线程A其实并不知道线程B执行的具体情况,这种突然间地停止会导致线程B的一些清理工作无法完成,还有一个情况是执行stop方法后线程B会马上释放锁,这有可能会引发数据不同步问题。基于以上这些问题,stop()方法被抛弃了。
所以,出现了interrupt()方法,这个方法不会真正停止一个线程,仅仅是给线程设立了停止标志位。然后让线程自己去结束自己。
DEMO演示:
这篇文章主要介绍了java线程的基础,包括,线程的定义,实现方法,生命周期,常见方法。
下一篇中,将会介绍java线程中的优先级以及同步的问题
一.实现线程的方法
1.1继承Thread类新建一个类,继承Thread,然后重写父类中的run()方法。在run()方法中写具体的实现功能,如下:
public class YyqThread extends Thread{
@Override
public void run() {
//具体处理的逻辑
}
}
启动这个线程也很简单,new出YyqThread的示例,然后调用它的start()方法。 YyqThread yyqThread = new YyqThread();
yyqThread.start(); 1.2实现Runnable接口的方式 相比第一种方法,减少耦合度。这种方式的定义以及启动如下: public class ImpleThread implements Runnable{
@Override
public void run() {
//具体处理的逻辑
}public static void main(String[] args) {ImpleThread impleThread = new ImpleThread();Thread thread = new Thread(impleThread);thread.start();}}说明:新建的时候,实现runnable接口,处理逻辑写在run( )中,启动方式也会不同,新建一个Thread,构造函数中传入runnable的参数,本例中就是impleThread,接着调用Thread的start方法。
1.3不用实现Runnable接口,可以采用匿名内部内的方法
new Thread(new Runnable() { @Override public void run() { // 具体处理的逻辑 } }).start();
二.线程的生命周期
线程具有7种生命周期,分别是出生状态,就绪状态,运行状态,等待状态,休眠状态,阻塞状态,死亡状态。出生状态:当线程被new出来的时候,就是刚创建的时候;
就绪状态:当调用start()方法之后;
运行状态:当线程得到系统资源后;
等待状态:当线程处于运行状态中,调用wait()方法后;当进入等待状态的线程,只有调用Thread的notify()方法才会被唤醒;
休眠状态:当调用sleep()方法之后;
阻塞状态:当线程在运行状态时,发出输入/输出请求的时候,进入阻塞状态,等待输入/输出结束之后,线程进入就绪状态;
死亡状态:让run()方法执行完毕,线程进入死亡状态。
三.线程的其他方法
3.1线程的休眠调用sleep()方法,指定的参数表示休眠的时间,单位为毫秒
3.2线程的join()方法
两个线程A 和 B,当需要B线程执行完毕之后,才能执行A线程,就可以在A线程中用ThreadB.join()方法。
Demo以及结果:public class ThreadJoin {
//线程A的定义
Thread threadA = new Thread( new ThreadA());
public class ThreadA impl
4000
ements Runnable{
@Override
public void run() {
System.out.println("I am ThreadA, waiting for ThreadB finished....");
try {
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I am ThreadA, ThreadB has finished!");
}
}
//线程B的定义
Thread threadB = new Thread( new ThreadB());
public class ThreadB implements Runnable{
@Override
public void run() {
System.out.println("ThreadB is running....");
}
}
public static void main(String[] args) {
ThreadJoin threadJoin = new ThreadJoin();
threadJoin.threadA.start();
threadJoin.threadB.start();
}
}
运行结果:
I am ThreadA, waiting for ThreadB finished....
ThreadB is running....
I am ThreadA, ThreadB has finished!
可以看出,当在线程A中调用线程B的join方法,确实会等待B线程执行完毕之后,才会继续执行A线程。
3.2线程的中断
注意:stop()方法是可以由一个线程去停止另外一个线程,线程A调用线程B的stop方法去停止线程B,调用这个方法的时候线程A其实并不知道线程B执行的具体情况,这种突然间地停止会导致线程B的一些清理工作无法完成,还有一个情况是执行stop方法后线程B会马上释放锁,这有可能会引发数据不同步问题。基于以上这些问题,stop()方法被抛弃了。
所以,出现了interrupt()方法,这个方法不会真正停止一个线程,仅仅是给线程设立了停止标志位。然后让线程自己去结束自己。
DEMO演示:
public class InterruptTHread { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { boolean isContinue = false;//设立中断标志位,默认值false @Override public void run() { long time = System.currentTimeMillis();//记录线程刚执行的时间 // TODO Auto-generated method stub while(true) { System.out.println("hello"); long time1 = System.currentTimeMillis();//记录每次打印hello完之后的时间 if(time1 - time > 1000) { isContinue = true;//1s过后,设置标志位为true,线程不再执行。 } if(isContinue) break; } } }); thread.start(); } }程序说明:线程打印“hello”1s,1秒过后,设置标志位为true,跳出循环,不再打印。
这篇文章主要介绍了java线程的基础,包括,线程的定义,实现方法,生命周期,常见方法。
下一篇中,将会介绍java线程中的优先级以及同步的问题
相关文章推荐
- day1 java基础回顾-多线程
- day1 java基础回顾- Properties类与配置文件
- Java基础回顾——重难点易错点【2】
- Java基础回顾_Java property_属性 method_方法定义及范围权限控制
- java基础知识回顾之javaIO类--File类应用:删除带内容的目录
- java基础知识回顾----流程控制
- Java基础回顾(3)
- java基础知识回顾之javaIO类---FileWriter和FileReader
- Java_基础知识回顾
- java基础知识回顾
- Java基础回顾 : 基本数据类型的包装类
- Java基础回顾_Exception异常使用详解
- Java基础回顾_IO流_File简单操作
- Java基础小技巧回顾--浅析String ==操作
- Java回顾之一些基础概念
- JAVA基础回顾2 遍历指定文件目录 遍历删除目录 指定文件清单列表
- java基础知识回顾之java Socket学习(二)--TCP协议编程
- Java基础重点回顾
- java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”
- Java基础回顾 : 关于日期操作类的笔记