黑马程序员_java多线程技术
来源:互联网 发布:淘宝性价比高的女装店 编辑:程序博客网 时间:2024/05/18 15:55
class ThreadDemo extends Thread{public void run(){//线程所要执行的代码必须放到run方法中,因为启动线程后,此线程会默认执行run方法的内容System.out.println("我是线程:"+getName());}}public class Test{public static void main(String[] args){ThreadDemo td1=new ThreadDemo();//创建线程对象ThreadDemo td2=new ThreadDemo();td1.start();//启动一个线程td2.start();}}
class ThreadDemo implements Runnable{public void run(){System.out.println("我是线程:");}}public class Test{public static void main(String[] args){Thread td1=new Thread(new ThreadDemo());Thread td2=new Thread(new ThreadDemo());td1.start();td2.start();}}
三:多线程的四种状态
3.运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
4.阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
5.死亡状态:正常情况下run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放。
四:线程的同步
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
1. synchronized 方法:通过在方法声明中加入synchronized关键字来声明 synchronized 方法。synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程能获得该锁,重新进入可执行状态。其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized。
如:
class ThreadDemo implements Runnable{String name;public synchronized void run(){name="你好世界";System.out.println(name);}}public class Test{public static void main(String[] args){Thread td1=new Thread(new ThreadDemo());Thread td2=new Thread(new ThreadDemo());td1.start();td2.start();}}
2. 在 Java 中,不光是类实例,每一个类也对应一把锁,我们也可将类的静态成员函数声明声明为 synchronized,以控制其对类的静态成员变量的访问。synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法run()声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何synchronized方法的调用都永远不会成功。所就有了 synchronized 块的出现,通过 synchronized关键字来声明synchronized 块。
如:
class ThreadDemo implements Runnable{String name;private Object obj=new Object();//创建一个对象,用它来当锁public void run(){synchronized(obj){name="你好黑马";System.out.println(name);}}}public class Test{public static void main(String[] args){Thread td1=new Thread(new ThreadDemo());Thread td2=new Thread(new ThreadDemo());td1.start();td2.start();}}
- 黑马程序员_java多线程技术
- 黑马程序员_java多线程
- 黑马程序员_JAVA多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_Java 多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_java多线程
- 黑马程序员_Java多线程
- 黑马程序员_Java多线程
- 黑马程序员_java多线程
- 基于Cortex M3 (lpc1768)头文件 lpc17xx.h 的分析注释
- AAM算法简介
- Dive into Netbeans: Lookup
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- CF 286A(Lucky Permutation-数列找规律)
- 黑马程序员_java多线程技术
- 【推荐】WinForm开发,窗体显示与传值总结
- memset应用
- Sliding Window poj 2823
- 正整数类(项目四)
- 不能从nandflash启动原因之一
- 分布式key-Value存储
- #Sam有话说#我们不是独行侠
- UNP总结 Chapter 6 I/O复用:select和poll函数