您的位置:首页 > 编程语言 > Java开发

java线程学习详解、总结!

2017-08-12 16:03 856 查看

进程 Program:是一个指令的集合。

进程 Process:(正在执行中的程序)是一个静态的概念。

1、进程是程序的一次静态执行过程,占用特定的地址空间.

2、每个进程都是独立的,由3部分组成

线程:是进程中一个单一的连续控制流程执行路径。

1、线程又被称为轻量级进程

2、一个进程可拥有多个并行的线程

3、一个进程中的线程共享相同的内存单元/内存地址空间à可以访问相同的变量和对象,而且它们从同一堆中分配对象à通信、数据交换、同步操作

4、由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。

Java线程的实现方式:

1、继承Thread抽象类重写run方法。

2、实现Runnable接口重写run方法。

出现Runnable接口的原因:因为java是单继承多实现的,继承往往会被占用,而无法通过Thread来实现多线程,但是可以通过实现Runnable接口而达到目的。

public class ThreadDemo01 extends Thread {
//重写父为的run方法
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("第"+i+"次threadrun.");
}
}
public static void main(String[] args) {
//创建对象,就创建好一个线程
ThreadDemo01 d=new ThreadDemo01();
//d.run();//启动线程使用start方法
d.start();
for(int i=0;i<5;i++){
System.out.println("main-->"+i);
}
}
}
public class RunableDemo implements Runnable {
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("第"+i+"次threadrun.");
}
}
public static void main(String[] args) {
//创建对象,就创建好一个线程
RunableDemo rd=new RunableDemo();
Thread t=new Thread(rd);
t.start();
for(int i=0;i<5;i++){
System.out.println("main-->"+i);
}
}
}


线程的状态:

1、新生状态:用new关键字建立一个线程后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start();方法进入就绪状态。

2、就绪状态:处于就绪状态县城就具备运行条件,但还没分到CPU,处于线程就绪队列,等待系统为其分配CPU。当系统选定一个等待的线程后,他就会从就绪队列进入到执行状态,称为“CPU调度”。

3、运行状态:在运行状态的线程执行自己的run方法中代码,直到等待某资源而阻塞或完成任何而死亡。如果在给定的时间片内没有执行结束,就会被系统给换下来回到等待执行状态。

4、阻塞状态:处于运行状态的线程在某些情况下,如执行了wait()、join()、sleep()方法进入阻塞状态。阻塞状态的线程只有等到取消后才可以重新进入就绪状态。Wait()方法必须用notify()或者notifyAll()唤醒。

5、死亡状态:死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有三个,一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过stop方法来终止一个线程【不推荐使用】;三是线程抛出未捕获的异常。

线程同步:

1、
必须有两个或者两个以上的线程

2、
必须是多个线程使用同意资源。

3、
必须保证同步中只能有一个线程在运行。

同步监视器:

1、
synchronized(obj){}中的obj称为同步监视器

2、同步代码块中同步监视器可以是任何对象,但是推荐使用共享资源作为同步监视器

同步方法中无需指定同步监视器,因为同步方法的监视器是this,也就是该对象本
线程操作的相关方法:

 

RunnableDemo rd=new RunnableDemo();
Thread t=new Thread(rd);
Thread t2=new Thread(rd);
t2.sleep(1000);   //线程休眠5秒
t.yield();   //线程暂停
t2.start();
t.join();  //线程插队
t2.stop(); // 线程停止
t2.wait();  //线程等待(需要唤醒)
t2.notify();  //唤醒当前线程
t.start();
Thread t1=Thread.currentThread();  //返回当前正在执行的线程
System.out.println(t1.getName());  //获取线程的名称
System.out.println(t.getPriority());  //返回当前线程的优先级
System.out.println(t.isAlive());   //判断线程是否在运行。



public  void run() {
while(true){
sale();
}
}
public synchronized void sale(){
//通常将当前对象作为同步对象
if (tick>0) {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"卖票:"+tick--);
}
}


线程通信:

wait()、noitfy()和notifyAll()组成,必须在同步方法块或者同步方法中,否则会抛出异常。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: