学习java第二十二天
进程与线程
进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多进程操作系统能同时达运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。
多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分。所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。
Java中线程实现的方式
在 Java 中实现多线程有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable 接口。
package Demo01;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String name) {
this.name = name;
}
public Person() {
}
public void run() {
for(int i=0;i<20;i++)
{
System.out.println(name+"-->"+i);
}
}
}
package com.hg.day22.demo01;
/*
主线程 执行main()方法的线程
单线程程序:只有一个程序
*/
public class Demo01MAainThread {
public static void main(String[] args) {
Person p1=new Person("小强");
p1.run();
// System.out.println(0/0);
Person p2=new Person("小刚");
p2.run();
}
}
主线程与线程的生命周期
线程是一个动态的执行过程:就如人的生老病死,一个线程的生命周期要经历创建、就绪、运行、挂起、终止5中状态。
创建–>就绪–>运行–>挂起–>终止
package demo02;
/*/
* 创建thread子类
* 重写run方法
*/
public class MyThread extends Thread{
public void run() {
//String name=getName();
//System.out.println("run: "+name);
System.out.println("子"+Thread.currentThread().getName());
}
}
package Demo02;
import Demo01.MyThread;
public class Demo01Thread {
public static void main(String[] args) {
//3.创建Thread子类的对象
MyThread mt = new MyThread();
//4.调用start方法
mt.start();//子进程0
new MyThread().start();//子进程1
new MyThread().start();//子进程2
new MyThread().start();//子进程3
System.out.println("main:"+Thread.currentThread().getName());
}
}
如果希望线程休眠一段时间可以使用sleep(long)的方法
package demo03;
public class demo03Sleep {
public static void main(String[] args) {
for(int i=1;i<60;i++) {
System.out.println(i);
try {
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
例题(买票)
package Demo05ThreadSafe;
public class RunnableImpl implements Runnable {
private int ticket = 100;
Object obj = new Object();
@Override
public void run() {
while(true) {
synchronized(obj) {
if(ticket>0) {
try {
Thread.sleep(1);
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-->正在买第"+ticket+"张票");
ticket--;
}
}
}
}
}
package Demo05ThreadSafe;
public class Demo01Ticket {
public static void main(String[] args) {
RunnableImpl run = new RunnableImpl();
Thread t0 = new Thread(run);
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
t0.start();
t1.start();
t2.start();
}
}