线程——Thread

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令 指针(PC), 寄存器集合和 堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有 就绪阻塞运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程

名词解释:进程,一个运行着的程序,一个进程里面又可以同时干多件事情,干着的每一件事情叫做一个线程。对于单个CPU的电脑:多线程本质上还是顺序执行的,并发;对于多个CPU的电脑,每一个CPU各自干着自己的事情,并行。

一个进程至少有一个线程,java进程中main线程。

在java中如何写一个线程
1)继承Thread类,重写run方法,可以实现一个线程,调用start()方法启动线程
2)实现Runnable接口,实现run方法,new Thread(Runnalbe r).strat();

package Test2;


public class MainTest {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
td.start();
ThreadDemo2 td2 = new ThreadDemo2();
new Thread(td2).start();
while(true){
System.out.println(Thread.currentThread().getName()+"Main程序进行中");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package Test2;


public class ThreadDemo extends Thread{
public void run(){
while(true){
System.out.println(this.getName()+"程序出现Bug");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

package Test2;


public class ThreadDemo2 implements Runnable{


public void run() {
while (true) {
System.out.println(Thread.currentThread().getName()+"程序正在进行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}

同步synchronized:

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。
package Test2;
public class yinhangDemo extends Thread{
public static int a=100;
public void run() {
while (a>0) {
synchronized (yinhangDemo.class) {
a--;
System.out.println(this.getName()+"余额为:"+a);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
}
package Test2;
public class TestDemo2 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
yinhangDemo demo = new yinhangDemo();
demo.start();
}
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值