黑马程序员--Java多线程
来源:互联网 发布:域名注册是永久的吗 编辑:程序博客网 时间:2024/06/02 04:15
一、Java多线程的基本知识
进程是指正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
线程是指进程中独立的运行单元,一个进程中至少有一个以上的线程。
Jvm启动时一般会有一个主线程,负责main方法里程序的执行,主程序执行的代码都在main方法里。Jvm在启动的时候会有多个线程在执行,除了主线程还有负责垃圾回收等功能的线程在执行。
二、创建线程的两种方式
第一种是继承Thread类。
主要步骤如下:
1.创建一个集成Thread的类。
2.重写Thread里的run方法。
3.在run方法里面写需要在线程里执行的程序。
下面就是一个线程的例子
package itheima.mythread;
public class MyThread extends Thread{
//创建线程的第一种方式:继承Thread类。
@Override
public void run(){
System.out.println("第一个线程!");
while(true){
System.out.println(Thread.currentThread().getName()+"正在运行!");
}
}
public MyThread(){}
public MyThread(String name){
super(name);
}
public static void main(String[] args){
//正常的写法
MyThread my=new MyThread();
my.start();
my.setName("第一个线程!");
//简化的写法
new Thread(){
public void run()
{
System.out.println("简化的线程!");
}
}.start();
while(true){
System.out.println("main方法线程:"+Thread.currentThread().getName());
}
}
}
创建线程的第二种方式是实现Runnable接口。步骤如下:
1.定义实现Runnable接口的类。
2.在类中实现Runnable接口的run方法。
3.在方法里面定义需要在线程里实现的代码。
下面的例子就是通过实现Runnable接口来创建一个线程:
package itheima.mythread;
public class MyThread2 implements Runnable{
//线程的第二种方法,实现runnable接口
public static void main(String[] args){
MyThread2 mythread=new MyThread2();
Thread thread=new Thread(mythread);
thread.start();
//简单的实现
new Thread(new MyThread2(){
public void run(){
System.out.println("使用匿名内部类简化格式!");
}
}).start();
}
@Override
public void run() {
// TODO Auto-generatedmethod stub
System.out.println("实现Runnable的线程!");
}
}
通过实现Runnable接口可以避免Java单继承的局限性。实现方式和继承方式的区别:
1.继承Thread:线程代码存放在 Thread子类 run方法中
2.实现Runnable:线程代码存放在接口的子类的 run方法中
建议使用第二种线程创建方法。因为第二种方式更加体现面向对象思想。
三、线程的状态与安全性
1.线程间的通讯
线程间通信-等待唤醒机制:
wait(),notify(),notifyAll(),都使用在同步中,因为要对持有监视器(锁)的线程操作。
为什么这些方法都定义在Object类中:
因为这些方法在操作同步中线程时,都必须要标识他们所操作线程只有的锁,只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒,也就是说,等待和唤醒必须是同行一个锁调用的方法定义object类中。
wait方法和sleep方法的区别:wait是释放资源释放锁,sleep是释放资源不释放锁。
同步代码块和同步方法的区别:同步代码块使用的锁可以是任意对象,同步方法使用的锁是当前对象,静态方法同步的锁是该类的字节码文件对象,静态方法在加载时所属于类,这时有可能还没有该类产生的对象,但是该类的字节码文件加载进内存就已经被封装成了对象,这个对象就是该类的字节码文件对象。
JDK1.5中,提供了许多线程解决方案,将同步synchrozed替换成显示 Lock操作,Lock
替代了 同步synchronized
方法和语句的使用,提供了显示的锁机制方法。
void lock();获取锁
void unlock();释放所
将Object中的 wait ,notify,notifyAll,替换成了condition对象。 该对象可以Lock锁,进行获取。
如何停止线程:
1.加入循环,循环结束,线程就技术。
2.使用interruput()方法强制中断循环。
Join():当A线程执行到了B线程的.Join()方法时,A线程就会让出CPU执行权,等待直到B线程执行完,A才会执行。Join可以用来临时加入线程执行。
优先级:线程对象.setPriority(intnewPriority);设置线程优先权,1-10,线程执行权越大在CPU中就优先执行(Thread.MAX_PRIORITY, MIN_PRIORITY ,NORM_PRIORITY)。
staticvoidyield():暂停当前正在执行的线程,并执行其他线程,Thread.yield();
- 黑马程序员-java多线程
- 黑马程序员--java 多线程
- 黑马程序员-java多线程
- 黑马程序员--Java多线程
- 黑马程序员--java多线程
- 黑马程序员:Java多线程
- 黑马程序员 Java多线程
- 黑马程序员---Java多线程
- 黑马程序员---多线程【java】
- 黑马程序员----JAVA----多线程---
- 黑马程序员-java多线程
- 黑马程序员-java 多线程
- 黑马程序员-------Java多线程
- 黑马程序员-java多线程
- 黑马程序员-Java多线程
- 黑马程序员 java 多线程
- 黑马程序员--java多线程
- 黑马程序员-java多线程
- HTTP GET,线程的使用
- 马的走法
- 算法导论 堆排序 C语言实现
- sqlplus登陆方式
- 根据value来定位key在C#的Dictionary中如何实现?
- 黑马程序员--Java多线程
- 插入排序:表插入
- glPixelStorei
- POJ1015
- 6引擎
- 循环-13. 求特殊方程的正整数解(15)
- 华三工作(二天)
- CentOS 6.3 32位静默安装Oracle 11g r2详细教程
- 29-java中Switch参数可以是什么?