思维导图如下
进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时达运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。
多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分。所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。
在 Java 中实现多线程有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable 接口。
Thread 类和 Runnable 接口之间在使用上也是有区别的,如果一个类继承 Thread类,则不适合于多个线程共享资源,而实现了 Runnable 接口,就可以方便的实现资源的共享。
一个多线程的程序如果是通过 Runnable 接口实现的,则意味着类中的属性被多个线程共享,那么这样就会造成一种问题,如果这多个线程要操作同一个资源时就有可能出现资源同步问题。
解决方法:
同步代码块
synchronized(同步对象){
需要同步的代码
}
实例代码如下:
class MyThread implements Runnable{
private int ticket = 5 ; // 假设一共有5张票
public void run(){
for(int i=0;i<100;i++){
synchronized(this){ // 要对当前对象进行同步
if(ticket>0){ // 还有票
try{
Thread.sleep(300) ; // 加入延迟
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("卖票:ticket = " + ticket-- );
}
}
}
}
};
public class SyncDemo02{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ; // 定义Thread对象
Thread t2 = new Thread(mt) ; // 定义Thread对象
Thread t3 = new Thread(mt) ; // 定义Thread对象
t1.start() ;
t2.start() ;
t3.start() ;
}
};
同步方法
synchronized 方法返回值 方法名称(参数列表){
}
class MyThread implements Runnable{
private int ticket = 5 ; // 假设一共有5张票
public void run(){
for(int i=0;i<100;i++){
this.sale() ; // 调用同步方法
}
}
public synchronized void sale(){ // 声明同步方法
if(ticket>0){ // 还有票
try{
Thread.sleep(300) ; // 加入延迟
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("卖票:ticket = " + ticket-- );
}
}
};
public class SyncDemo03{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ; // 定义Thread对象
Thread t2 = new Thread(mt) ; // 定义Thread对象
Thread t3 = new Thread(mt) ; // 定义Thread对象
t1.start() ;
t2.start() ;
t3.start() ;
}
};
其实就是在实现了Runnable接口的类中的run方法中写代码,然后new一个Thread,用Thread的start方法来启动另外的线程去执行run方法中的代码
参考文章
Java多线程看这一篇就足够了
-------------------------------------------------------------------------
android开发艺术中关于HandlerThread的介绍
HandlerThread的run方法是一个无限循环,因此当明确不需要再使用Handler时,可以通过它的quit或者quitSafely方法来终止线程的执行。代码如下所示:
HandlerThread handlerThread = new HandlerThread("我是HandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper()) {//创建Handler对象时,如果添加了Loop参数,那么Handler将被创建在Loop所在的线程中
@Override
public void handleMessage(Message msg) {
//这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作
switch (msg.what) {
case 0:
Log.d("CeShi",Thread.currentThread().getName()+ ":收到了");
break;
default:
break;
}
}
};
handler.sendEmptyMessage(0);//在主线程给handler发送消息
/*输出结果为:
05-24 18:29:57.487 32249-32266/? D/CeShi: 我是HandlerThread:收到了*/