java线程
来源:互联网 发布:服务器默认端口号 编辑:程序博客网 时间:2024/06/05 10:34
一、对于线程的理解
一个线程对应的是一个实例化的线程类对象,初始化一个线程类,就创建了一个线程,当多个线程同时对某一个对象或内存进行操作时,才会考虑线程的同步
二、线程的创建方法
(1)继承Thread类,并重写run()方法
(2)实现Runnable接口,重写run()方法,然后将该实现类的对象,做为Thread类的初始化参数来创建Thread对象,该Thread对象才是真正的线程对象,调用start()方法启动线程
RunnableThreadTest rtt = new RunnableThreadTest(); new Thread(rtt,"新线程1").start(); new Thread(rtt,"新线程2").start();
(3)使用Callable和FutureTask创建线程
编写一个类,实现Callable类,重写call方法,实例化该实现类,作为FutureTask类实例化的参数,然后将FutureTask的实例化对象作为线程类的实例化对象的参数
package com.thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class CallableThreadTest implements Callable<Integer> { public static void main(String[] args) { CallableThreadTest ctt = new CallableThreadTest(); FutureTask<Integer> ft = new FutureTask<>(ctt); for(int i = 0;i < 100;i++) { System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i); if(i==20) { new Thread(ft,"有返回值的线程").start(); } } try { System.out.println("子线程的返回值:"+ft.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override public Integer call() throws Exception 37. { 38. int i = 0; 39. for(;i<100;i++) 40. { 41. System.out.println(Thread.currentThread().getName()+" "+i); 42. } 43. return i; 44. } 45. 46.}
三种方法对比:继承Thread类对象不能再继承其他的类,拓展性不好,使用接口的形式比较复杂
三、线程的状态
新建状态:new Thread(),则线程就进入新建状态
就绪状态:t1.start();启用start方法之后,线程就进入就绪状态,等待cpu分配资源
运行状态:runing,调用run方法,
死亡状态:当run方法结束,调用stop方法让一个线程中止运行
堵塞状态:
yield()方法,线程进行让步
调用sleep(long time)方法,线程会进入休眠状态,时间结束后自动进入就绪状态
等待方法,调用wait方法,要想进入到就绪,则使用notify()方法或者notifyAll()方法
被另一个线程所阻塞,调用suspend()方法,调用resume()方法,进入就绪
四、常用方法
Thread.start();
Thread.run();
Thread.joyin((long millis);让一个线程等待另一个线程
Thread.yield();线程进入阻塞状态
Object.wait();
Thread.sleep();
五、线程的优先级
Thread t2 = new MyThread();
t2.setPriority(Thread.NORM_PRIORITY+3);
六、yield和sleep的区别
sleep给其他线程机会时不会考虑线程优先级,yield只会给同级或者比他高的优先级线程让步,
sleep是让线程进入到阻塞状态,结束时间之后才会进入就绪状态,而yield方法是将线程进入就绪状态,完全有可能刚进入就绪状态的线程又立马被调用
sleep声明和抛出InterruptedException异常,而yield没有异常
sleep有更好的移植性,通常不建议使用yield处理并发线程执行
六、多线程和死锁
使用synchronized关键字
- Java线程:什么是线程
- Java线程:线程池
- java线程--线程退出
- JAVA-线程/线程锁
- Java线程:什么是线程
- Java线程:线程中断
- Java线程:线程状态
- Java线程: 线程调度
- Java线程:线程交互
- java--线程--线程池
- java 线程
- Java线程
- java线程
- java线程
- Java线程
- Java线程
- java线程
- JAVA 线程
- 再谈C#如何重复使用已有的代码.
- redis基本命令
- oracle常用命令--插入/添加表数据之insert命令
- 关于进程或机器间通信问题
- Ill-advised or mistaken usage of a core class
- java线程
- Eclipse 的 Jetty 插件安装
- 高德,百度,Google地图定位偏移以及坐标系转换
- Essential Studio for WPF更新至2017 v2,新增Adobe X安全性等功能丨附下载
- Spring 框架简单应用--ioc
- 使用association标签实现结果集的嵌套
- ONVIF协议网络摄像机(IPC)客户端程序开发(9):鉴权(认证)
- WGS84,GCJ02, BD09坐标转换
- 使用docker的简单教程