------- android培训、java培训、期待与您交流! ----------
进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应用程序的执行顺序。
进程中最少有一个线程
多线程特性
1.随机性
2.谁强盗谁执行,至于执行多长,由CPU说了算
返回当前线程的名称:Thread.currentThread().getName()
线程的名称是由:Thread-编号定义的。编号从0开始。
线程要运行的代码都统一存放在了run方法中。
线程要运行必须要通过类中指定的方法开启。start方法。(启动后,就多了一条执行路径)
start方法:1)、启动了线程;2)、让jvm调用了run方法。
创建线程的第一种方式:继承Thread ,由子类复写run方法
public class Test {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
}
}
class MyThread extends Thread{
public void run(){
for(int x = 1;x<=100;x++){
System.out.println(x);
}
}
}
创建线程的第一种方式:实现Runnable接口,实现run方法
实现方式的好处:避免了单继承的局限性
public class Test {
public static void main(String[] args) {
MyThread m = new MyThread(); //创建该对象
Thread t = new Thread(m);//建立Thread对象把实现了Runnable接口的对象以参数形式传入Thread构造函数中
t.start();//调用start方法开启线程
}
}
class MyThread implements Runnable{
public void run(){
for(int x = 1;x<=100;x++){
System.out.println(x);
}
}
}
获取线程名称:getName(); Thread-编号 编号从0开始
多线程的安全问题
问题原因:当多个线程在操作同一个共享数据时,一个线程执行了一部分,还没执行,另一个线程参与进来了,导致数据的错误。
解决方法:对个线程操作共享的语句,只能让一个线程执行完,在执行的过程中,其他线程不可以参与进来执行。
java提供了解决多线程安全问题的方式,就是同步
好处:解决了线程安全问题。
弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁。
同步的前提
1.必须有两个以上的线程
2.必须是多个线程使用同一个锁
同步有三种
1.同步代码块,可以使用任意对象作为锁
2.同步函数,固定是this锁
3.静态同步函数,固定是所属类名.class
举例(多线程卖票例子)
public class Test {
public static void main(String[] args) {
Sell s = new Sell();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
}
}
class Sell implements Runnable{
private int PI = 100;
Object obj = new Object();
public void run() {
while(true){
synchronized(obj){
if(PI>0){
System.out.println(Thread.currentThread().getName()+"..."+PI--);
}
}
}
}
}
线程间的通讯:就是多个线程在操作同一个资源,但是操作动作不同
wait和sleep的区别
wait:释放资源释放锁,必须要调用notify才能唤醒
sleep:释放资源不释放锁,可以定义时间,时间一到自动就醒了
停止线程
1.run方法结束
2.定义循环标记,让循环退出,让run方法结束
守护线程(setDaemon())
当进程中只剩下守护线程,该进程就结束退出。