程序,进程,线程:
基本概念:
程序:是为了完成特定的任务,用某种语言编写的一组指令的集合。即一段静态的代码,静态对象。
进程:是程序的一次执行过程,或正在运行的一个程序,是一个动态的过程。
线程:作为进程的进一步细分,是一个程序内部的一条执行路径。一个进程可以分为多个线程(多线程:几乎同时执行。一个处理器只能在一个时间点上处理一个线程)
三者之间的区别区别
程序:是静态的
进程:,是动态的,作为资源分配的单位,进程之间互不干扰,而且进程属于操作系统的范畴,在同一时间点可以多个进程同时执行
线程:作为调度和执行的单位,在同一进程中,线程之间可能会互相干扰,而且在同一时间点几乎同时执行多个线程
使用线程的重要性:
1.使用线程可以把长时间占据程序中的任务放到后台进行处理
2.用户界面可以更加吸引人。比如:用户点击一个按钮去触发某个或某些事件的处理,可以弹出一个进度条来显示处理进度
3.程序的运行速度可以加快
使用多线程的条件:
1.程序需要执行多个任务的时候
2.程序需要实现一些需要等待的任务的时候。如:用户输入,文件读写,网络操作,搜索等
3.需要后天运行的时候
线程的创建和启动(继承Thread类,实现Runnable接口)
继承Thread类
1.创建一个继承于Thrad类的子类
2.重写Thread中的run方法
3.创建Thread类的子类的对象
4.通过此对象调用start()
public class testThread{
public ststic void main(String[] args){
MyThread mt = new MyThread();
mt.start(); for(int i=0;i<100;i++){ System.out.println(i+"+++++++++++++++++++++++++++++") } new Thread(){ public void run(){ System.out.println("实现了匿名Thread子类//////////////"); } }.start();
}
}
class MyThread extends Thread{
public void run(){ for(intj=0;j<100;j++){
System.outprintln("实现了Thread子类,,,,,,,,,,,");
} }
}
实现Runnable接口
1.创建一个实现 了Runnable接口的类
2.实现类中的Runnable中的抽象方法run()
3.创建实现类的对象
4.把此对象作为参数传递到Thread类中的构造器中,创建Thread对象
5.通过Thread类的对象调用start()
实现方式的比较
优先使用 :继承Runnable接口的方式
原因:1.实现的方式没有类的单一继承的局限性
2.实现的方式更适合用来处理多个线程之间有共享数据的情况
联系:public class Thread implements Runnable
共同点:两者都需要重写run方法,把线程要执行的操作声明在run中
常用的线程方法
currentThread():返回当前正在执行线程对象
getId():返回此线程的标识符
getName():返回当前线程的名称
getPriority():获取当前线程的优先级
isAlive():测试此线程是否还处于活动状态(线程处于已启动尚未终止的状态或正处于正在运行或准备运行的状态)
sleep(long time):让当前线程休眠指定的毫秒数
yield():放弃当前cpu资源
join():在线程a中调用线程b的join()方法,线程a的状态变为阻塞,直到线程b执行完成后,线程a才继续执行
setName(String name):设置线程名字
isDaemon():判断当前线程是否是守护线程
setDaemon(Boolean on):把此线程标记为daemon线程或用户线程
生命周期

同步概念
同步的方式首先解决了线程安全问题,其次在操作同步代码块的时候,只能有一个线程参与,其他的线程等待。相当于是一个单线程的过程,效率相对低。
同步代码块
关键字synchronized(同步监视器){
//需要被同步的代码
}
说明:1.操作共享数据的代码,即为需要被同步的代码
2.共享数据:多个线程共同操作的变量
3.同步监视器:俗称:锁任何一个类的对象,都可以充当锁
要求:多个线程必须要共同一把 锁
补充:在实现Runnable接口实现代码块的时候,可以考虑使用this或类名.class作为锁
public class Ticket implements Runnable{
/**注意,如果是用继承的方式,此处必须用静态修饰*/
private int tickets = 60;
/**创建锁对象*/
private Object obj = new Object();
@Override
public void run(){
while(true){
synchronized(obj){
if(tickets>0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"张票");
tickets--;
}
}
}
}
}
public class SellTicketTest {
public static void main(String[] args) {
/**创建一份资源对象*/
Ticket t = new Ticket();
/**创建三个线程*/
Thread t1 = new Thread(t,"窗口一");
Thread t2 = new Thread(t,"窗口二");
Thread t3 = new Thread(t,"窗口三");
t1.start();
t2.start();
t3.start();
}
}
同步方法
1.同步方法任然涉及到同步监视器,知识不需要显示声明
2.非静态的同步方法,同步监视器是:this
静态的同步方法,同步监视器是:当前类本身(类名.class)
public class MethodSync {
* @Task : 测试 synchronized 修饰方法时锁定的是调用该方法的对象
* @param name 线程的标记名称
*/
public synchronized void method(String name){
System.out.println(name + " Start a sync method");
try{
Thread.sleep(300);
}catch(InterruptedException e){}
System.out.println(name + " End the sync method");
}
}
同步代码块与同步方法的区别
- 同步方法默认用this或者当前类class对象作为锁;
- 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
- 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰