首页 > 代码库 > java学习第22天(关于进程的创建及使用)

java学习第22天(关于进程的创建及使用)

多线程其实在操作系统已经深入了解过,现在就不做学习概念,其实理解线程很简单,首先进程就是一种正在内核态运行的软件,而线程就是一种轻量化的进程,和进程不同的是线程一般存在于一个进程中,共享地址空间。具体的可以参考操作系统的课程。

那么java程序的运行原理及JVM的启动是多线程的吗?
A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。

 

多线程的实现由三种方法

第一种

 继承Thread类并重写run方法

 public Class A extends Thread{

 @Override

   public void run(){

  }

}

注意使用的时候,我们不直接调用run方法,而是使用start启动线程。

A a=new A();

a.start //不是a.run

介绍几个线程中的方法,首先是获取名字:getName()//获取当前进程的名字。更改名字的方法 A a=new A(“thread_1”)

那么思考一个问题如果是其他的线程我们想获取名字但是并没有调用Thread类,比如我想要查看主线程的方法,使用getName,它会报错,因为主函数并不是Thread,此时有一个方法是,Thread currentThread() 方法可以返回一个Thread类型的参数,所以我们可以Thread currentThread().getName()。还有一个方法是优先级,关于调度的知识在操作系统和机组中都有说明。getPriority()获取当前线程的优先级。setPriority()设定优先级(最高为10,最低为1)。join(),它的作用是让某个线程执行完毕再

去执行其它线程。中断线程 interrupt(),它可以使线程中断,并返回一个InterruptedExpection类型,则收到这个错误之后,在类中的try catch中,catch收到错误,执行里面的内容,然后继续执行,这样的好处是代码可以通过走try catch,而继续执行下去。还有很多类似守护线程和礼让线程,可以自行看API了解。

第二种方式

 实现Runnable接口

 public Class A implements Runable{

 @Override

   public void run(){

  }

}

A a=new A();

//有点和第一类不一样了,需要创建Thread类的对象,并把上面类的对象作为参数传递。

Thread t1=new Thread(a,“Thread_1”);

t1.start();

那么我们先把这两种方法比较,为什么需要两种方法?原因是这样的,因为java是单继承的,也就是说,如果我的一个类有了父类或者以后可能需要继承那么我们就使用第二种方法。

需要注意的是如同在操作系统中学习的互斥区的概念,如果run中的代码对同步性有着很大的要求,举个例子:while(tickets>0){

 System.out.println(Thread.currentThread.getName()+"正在出售第 "+tickets--);

}

在多线程中这样的代码是不安全的,比如恰好我有三个进程同时进入while中,假设此时tickets都是1,那么此时会出现问题,第一个进程执行完了后,tickets变成0,但其他两个进程还在while中,所以还会继续执行,tickets变成-1.-2.那么我们应该怎么解决呢,这里的思想和互斥区的思想是一样的,我们使这段代码只允许一个进程进入,那么就可以解决问题了。使java提供的就是synchronized(),具体怎么使用呢?简单的说就是我们将需要同一时刻只允许执行一个进程的一段代码包起来。注意此时物品我们需要在代码外面建立一个对象作为共享对像。然后加入到这个方法中。举个例子:

Object ob=new Object();

synchronized(obj){

while(tickets>0){

 System.out.println(Thread.currentThread.getName()+"正在出售第 "+tickets--);

   }

}

 

java学习第22天(关于进程的创建及使用)