目录
- Java多线程讲解
- 一丶多线程简介
- 1.进程的概念
- 2.线程概念
- 3.Java中多线程Thread类
- 二丶多线程的创建
- 1.继承Thread类.重写run方法.
- 2.实现Runalbe接口.
- 三丶线程的启动和终止
- 四丶线程的状态
- 五丶线程控制的基本方法
- 1.线程名称
- 2.线程优先级
- 3.Sleep()方法
- 4.join()方法
- 5.isAlive()方法
- 六丶线程的同步
- 七丶死锁
- 八丶线程的通信
- 九丶线程高级API(Timer 丶 TimerTask)
- 一丶多线程简介
Java多线程讲解
一丶多线程简介
1.进程的概念
进程是什么,进程就是一个程序在运行中的一个实例.比如QQ.比如浏览器.这个就是多进程的状态.
意思就是可以同时运行多个程序.
可以打开任务管理器.观看我们的进程 ctrl + shift + esc 或者 ctrl + alt +del
2.线程概念
线程,线程就是同一个进程的多条路.我们知道代码都是顺序执行的.多线程的意思就是可以有多条代码一同执行.它是归属于进程的.进程可以看做一个外壳.真正执行代码的是线程.进程唯一的个线程就是执行代码.如果没有线程,那么进程也终结了.
Java中的单线程代码:
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100;i++) {
System.out.println("i = " + i);
Thread.sleep(1000);
}
for (int j = 0; j < 100;j++) {
System.out.println("j = " + j);
Thread.sleep(1000);
}
}
上面就是典型的单线程执行代码.第一个循环不执行完毕,第二个循环是不会执行的.
多线程程序则是,我可能当前执行打印i 后面就可能执行打印j了.
3.Java中多线程Thread类
java.lang.Thread是个线程类.核心的类.
还有一个借口是 Runnable 也可以实现多线程.
Thread类中需要了解的方法.
public void start()使该线程开始执行;指定run方法
public void run();我们需要重写这个方法.调用start则会执行我们的线程.
public static void sleep(long millis,int nanos)throws InterruptedException 延时命令给一个时间
二丶多线程的创建
线程的创建有两种办法,第一种继承Thread类.重写run方法.调用start开始执行.
第二种实现Runnable接口
1.继承Thread类.重写run方法.
public class ExtenThreadTest extends Thread {
public void run() {
for(int i = 0; i < 10; i ++) {
System.out.println("i = " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
外部调用:
public static void main(String[] args) throws Exception {
ExtenThreadTest t = new ExtenThreadTest();
t.start();
for(int j = 0; j < 100; j++) {
System.out.println("j = " + j);
Thread.sleep(100);
}
}
此时我们的run方法打印我们的i值, 主方法打印我们的j值.当线程发生切换的时候就会显示一种打印完i之后打印j的效果.
2.实现Runalbe接口.
有时候我们的java继承了一个类.但是自己当前类还需要可以支持多线程.现在不能继承Thread类了.
因为Java不能多继承.所以Java为我们提供了一个接口,实现这个接口即可. Runnable();
如果观看源代码可以得知,Thread类其实也是实现了Runnable接口.并且对Runnable接口的run方法重写的.
步骤:
- 1.创建一个类,实现Runnable接口,并且重写里面的run方法.
- 2.使用Thread创建Thread对象.构造方法.填写我们类的实例.
- 3.因为填写的是我们的实例.所以相当于重写了run方法.构成了多态
- 4.调用start()函数启动线程.
具体代码例子;
public class ExtenThreadTest implements Runnable {
public void run() {
for(int i = 0; i < 10; i ++) {
System.out.println("i = " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
使用代码
public static void main(String[] args) throws Exception {
Thread t = new Thread(new ExtenThreadTest()); //这里不同
t.start();//启动线程
t.setName("ExtenThreadTest");
for(int j = 0; j < 100; j++) {
System.out.println("j = " + j);
Thread.sleep(100);
}
}
三丶线程的启动和终止
1.线程的启动使用start()方法启动.如果直接调用run就是单线程程序
2.线程的结束可以使用stop();不过这个方法已经废弃了.正常的是你的线程中给一个标记. 通过外部设置标记.来让线程自然停止.
3.使用interrupt();方法.这个方法可能会抛异常,不推荐.
四丶线程的状态
线程的状态分为以下状态:
1.NEW 新建状态 当一个线程实例化之后,就处于这个状态
2.RUNNABLE 可以运行的, 当使用start方法的时候就是这个.线程可以用,但是不一定你能用.
3.BLOCKED 阻塞状态,使用Sleep()的时候是这个
4.WAITING 等待状态,两个线程进行通信的时候,进行登台
5.TIMED_WAITING 等待时间过了,就是Timed_waiting状态
6.TERMINATED 线程的正常终止.
五丶线程控制的基本方法
1.线程名称
每个线程都用自己的名字,我们可以在构造的时候传入线程名字
使用线程的 getName()获取名称.
Thread.currentThread().getNmae(); 获得当前线程名字. 主要方法就是 getNmae().
setName(String name);给线程设置名字
2.线程优先级
线程的优先级默认就是0,我们可以设置.
Thread t = new Thread();
t.setPriority(Thread.MAX_PRIORITY);
t.SETpRIORITY(Thread.MIN_PRIORITY); 一般不设置,主要是CPU操作的获取时间片
3.Sleep()方法
Sleep(); 方法就是让当前线程等待一下.将时间片放出去,cpu就会去指向其它线程.
使用Sleep之后,线程就是阻塞状态, blocked, 睡眠完毕之后就是 runable状态.
使用Sleep();会出现一个异常.代表你给我终止了.
如下代码:
public void fun()
{
for(int i = 0; i < 10;i++)
{
try
{
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printstackTrace();
}
if (i >=5){
this.interrupt(); 这句代码会产生异常
}
}
}
4.join()方法
5.isAlive()方法
六丶线程的同步
七丶死锁
八丶线程的通信
九丶线程高级API(Timer 丶 TimerTask)
原文地址:https://www.cnblogs.com/iBinary/p/9867128.html