创建方法
自定义Thread类的子类
自定义类实现Runnable接口
进程的定义
进程(process)是在一个数据集合上的
一次动态的执行过程,资源分配的基本单位
基本概念
包括pcb,数据段,代码段
基本状态:就绪/运行/阻塞
区别
程序是一段静态的代码,它是应用软件执行的蓝本。
进程是程序的一次动态执行过程
线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程
java中的线程
Java应用程序总是从主类的main方法开始执行。JVM加载代码发现main后,就会启动一个主线程,该线程负责执行main方法;
若main方法中创建其他线程,则JVM在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源;main方法即使执行完最后语句,JVM也要等所有线程都结束才结束整个Java程序。
过程
运行
线程调用***start()方法,通知JVM,JVM知道新线程排队等候切换;当此线程***获得CPU使用权后,执行线程的run()方法进行动作
等待:线程执行***wait()***方法,
例子
线程类有一个构造函数设置名字,有一个run函数设置内容
注意:
Thread大写
setName大写
for循环要写在线程类中
error:自己写个新的按顺序运行了??
class WriteWordThread extends Thread{ //Thread的子类负责创建线程对象
WriteWordThread(String s){
setName(s); //调用Thread类的setName方法为线程起个名字
}
public void run(){
for(int i=1;i<=8;i++){
System.out.println("我是一个线程,我的名字是"+getName());
}
}
}
主函数创建对象,调用start方法
public class Example8_1{
public static void main(String args[ ]){
WriteWordThread zhang,wang;
zhang=new WriteWordThread("张小红"); //新建线程
wang=new WriteWordThread("JamsKeven"); //新建线程
zhang.start(); //启动线程
for(int i=1;i<=8;i++){
System.out.println("我是主线程中的语句");
}
wang.start(); //启动线程
}
}
运行结果是三种输出轮流进行
实现runnable接口
class Bank implements Runnable{ //Bank类必须实现Runnable接口
private int money=0;
String name1,name2;
Bank(String s1,String s2){
name1=s1;
name2=s2;
}
public void setMoney(int mount){
money=mount;
}
public class Example8_4{
public static void main(String args[ ]){
String s1="会计",s2="出纳";
Bank bank=new Bank(s1,s2);
Thread zhang,cheng;
zhang=new Thread(bank);
cheng=new Thread(bank); //cheng和zhang是同一目标对象
zhang.setName(s1);
cheng.setName(s2);
bank.setMoney(120); //线程的目标对象修改被线程共享的money
zhang.start();
cheng.start();
}
}
临界区
Java使用***synchronized***关键词标识临界区(同步的)
联合
线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行
***B.join()***–联合
线程之间的制约关系
1线程的同步(消费者生产者)
2线程的互斥
本文深入介绍了Java中的线程和进程概念,包括线程的创建(通过Thread子类和Runnable接口)、进程的定义及其组成部分。通过示例展示了线程的启动与执行流程,解释了线程间的同步与互斥,特别是Java中的`synchronized`关键字在临界区的应用。同时,文章还探讨了线程间的联合操作如`join()`方法,以及线程间制约关系的实现方式。
162

被折叠的 条评论
为什么被折叠?



