Java多线程基础总结
来源:互联网 发布:mac 压感 编辑:程序博客网 时间:2024/04/30 02:04
一、线程的概述
进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。
线程:就是在一个进程中负责一个执行路径。
多线程:就是在一个进程中多个执行路径同时执行。
a.多线程的好处:
1.解决了一个进程里面可以同时运行多个任务(执行路径)。
2.提供资源的利用率,而不是提供效率。
b.多线程的弊端:
1.降低了一个进程里面的线程的执行频率。
2.对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。
3.公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,发生线程安全问题。
4.线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
二、创建方式
a.继承Thread类
/** * * @author QiShui 方式一,重写run方法,调用start转变为可执行状态 */class MyThread extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 20; i++) // Thread.currentThread().getName()获得子线程名字 System.out.println(Thread.currentThread().getName() + i); }}public class TestDemo { public static void main(String[] args) { // 使用子线程 MyThread myThread = new MyThread(); myThread.start(); /** * * JVM中至少有两个线程,主线程,和垃圾回收线程 */ for (int i = 0; i < 20; i++) // Thread.currentThread().getName()获得主线程名字 System.out.println(Thread.currentThread().getName() + i); }}
注意:子线程与主线程抢占资源,才不是普通方法。
b.实现Runable接口
/** * * @author QiShui * */class MyTest implements Runnable { @Override public void run() { for (int i = 0; i < 20; i++) // Thread.currentThread().getName()获得子线程名字 System.out.println(Thread.currentThread().getName() + i); }}public class TestDemo2 { public static void main(String[] args) { //简单调用 new Thread(new MyTest(),"testThread-1 ").start(); // 详细说明 MyTest test = new MyTest(); // 传入实现Runable类的对象,给他起名,并不是线程对象的名字。 Thread thread = new Thread(test, "testThread-2 "); thread.start(); /** * 注意: * 当thread调用start方法时,会调用自己的run方法,在方法里面 * 由于Runable不为空,调用的是MyTest类里的run方法 底层代码。 * * private Runnable target; * * @Override * public void run() * { * if (target != null) * { target.run(); } * * } * */ }}
三、线程的状态及生命周期分析
创建:新创建了一个线程对象。
可运行:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取cpu的执行权。
运行:就绪状态的线程获取了CPU执行权,执行程序代码。
阻临时塞: 阻塞状态是线程因为某种原因,如调用sleep,wait放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
死亡:线程执行完它的任务时。
四、线程中常见的方法
/** * 常见方法 * @author QiShui * */public class TestDemo3 extends Thread { /* * Thread(String name) 初始化线程的名字 getName() 返回线程的名字 setName(String name) * 设置线程对象名 sleep() 线程睡眠指定的毫秒数。 getPriority() 返回当前线程对象的优先级 默认线程的优先级是5 * setPriority(int newPriority) 设置线程的优先级 * 虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10 ,最小的1 , 默认是5)。 currentThread() * 返回CPU正在执行的线程的对象 */ public TestDemo3(String name) { //调用父类方法 /** * public Thread(String name) { * init(null, null, name, 0); * } */ super(name); } @Override public void run() { // TODO Auto-generated method stub super.run(); for(int i=0;i<10;i++){ System.out.println("Hello ,World !!"); } } public static void main(String[] args) { TestDemo3 testDemo3 = new TestDemo3("xiaoHuang");//初始化线程名字 testDemo3.setName("LaoWang");//设置线程名字 String name = testDemo3.getName();//获取线程名字 System.out.println(name); int priority2 = testDemo3.getPriority();//获取线程优先级,默认是是5 System.out.println(priority2); /** * 设置线程优先级,最低是1,最高为10,只是执行在前的概率大一点点 */ testDemo3.setPriority(8); System.out.println(testDemo3.getPriority()); /** * 线程睡眠3s,此时为阻塞状态 */ try { testDemo3.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } testDemo3.start(); //正在执行的对象 Thread currentThread = testDemo3.currentThread(); System.out.println(currentThread); }}
0 0
- java多线程基础总结
- Java多线程基础总结
- java多线程基础总结
- Java多线程基础总结
- java多线程基础总结
- java基础总结#多线程
- java基础 Java多线程总结
- java多线程基础知识点总结
- java基础 多线程 简单总结
- java基础5--多线程--要点总结
- 黑马程序员:Java基础总结----多线程
- 黑马程序员-Java基础-多线程总结
- 黑马程序员---Java基础总结--多线程
- Java基础总结----多线程安全性&同步
- java基础——多线程总结
- 黑马程序员---------Java基础------------多线程简单总结
- #面试java基础总结大全#多线程
- java基础 -- 多线程总结(一)--基本概念
- [矩阵]螺旋矩阵问题(上)
- java学习之路 之 面向对象编程-可变个参数-练习题
- Hibernate中不用基本类型
- 【POJ】[1061]青蛙的约会
- c++内存管理1
- Java多线程基础总结
- Ecplise 背景颜色修改
- 获取jdbctemplate的一种方法
- 数据库语句执行顺序
- poj 1185 炮兵阵地(状压dp)
- Makefile字符串、文本处理函数
- UVA 10779 Collectors Problem(最大流)
- 读《Node.js 权威指南》
- dubbo学习笔记