09_1_线程的基本概念

09_1_线程的基本概念

1. 线程的基本概念

线程的一个程序内部的顺序控制流。

线程和进程的区别

每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。

线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。

多进程:在程序系统中同时运行多个任务(程序)。

多线程:在同一个应用程序中有多个顺序流同时执行

Java的线程是通过java.lang.Thread类来实现的。

VM启动时会有一个自主方法(public static void main() {})所定义的线程。

可以通过创建Thread的实例来创建新的线程。

每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。

通过调用Thread类的start()方法来启动一个线程。

1.1实现线程的两种方式之一

TestThread1

package Test;

public class TestThread1 {

public static void main(String[] args) {

Runner1 t  = new Runner1();

new  Thread(t).start();

for (int i = 0; i < 1000; i++) {

System.out.println("Main Thread" + i);

}

}

}

class Runner1 implements Runnable {

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

System.out.println("Runner1 Thread" + i);

}

}

}

1.2实现线程的两种方式之一

TestThread2

package Test;

public class TestThread2 {

public static void main(String[] args) {

Runner2 t  = new Runner2();

t.start();

for (int i = 0; i < 1000; i++) {

System.out.println("Main Thread" + i);

}

}

}

class Runner2 extends Thread {

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

System.out.println("Runner1 Thread" + i);

}

}

}

2. sleep方法

sleep方法

可以调用Thread的静态方法:

public static void sleep(long millis) throws InterruptedException

使得当前线程休眠(暂时停止执行millis毫秒)

由于是静态方法,sleep可以由类名直接调用:

Thread.sleep()

例子:

package Test;

import java.util.Date;

public class TestThread3 {

public static void main(String[] args) {

Runner3 t = new Runner3();

t.start();

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

}

t.interrupt();

}

}

class Runner3 extends Thread {

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

return;

}

System.out.println("-------------" + new Date() + "---------------------");

}

}

}

3. 生产者消费者问题

public class ProducerConsumer {
	public static void main(String[] args) {
		SyncStack ss = new SyncStack();
		Producer p = new Producer(ss);
		Consumer c = new Consumer(ss);
		new Thread(p).start();
		new Thread(p).start();
		new Thread(p).start();
		new Thread(c).start();
	}
}

class WoTou {
	int id;
	WoTou(int id) {
		this.id = id;
	}
	public String toString() {
		return "WoTou : " + id;
	}
}

class SyncStack {
	int index = 0;
	WoTou[] arrWT = new WoTou[6];

	public synchronized void push(WoTou wt) {
		while(index == arrWT.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		arrWT[index] = wt;
		index ++;
	}

	public synchronized WoTou pop() {
		while(index == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		return arrWT[index];
	}
}

class Producer implements Runnable {
	SyncStack ss = null;
	Producer(SyncStack ss) {
		this.ss = ss;
	}

	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = new WoTou(i);
			ss.push(wt);
System.out.println("生产了:" + wt);
			try {
				Thread.sleep((int)(Math.random() * 200));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable {
	SyncStack ss = null;
	Consumer(SyncStack ss) {
		this.ss = ss;
	}

	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = ss.pop();
System.out.println("消费了: " + wt);
			try {
				Thread.sleep((int)(Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

原文地址:https://www.cnblogs.com/flyback/p/8965688.html

时间: 2024-09-30 04:24:04

09_1_线程的基本概念的相关文章

java多线程(1) 线程的基本概念

一.线程的基本概念: 线程是一个程序里面不同的执行路径. 程序里面不同的执行路径,每一个分支都是一个线程. 进程:静态的概念.机器上的一个class文件,机器上的一个exe文件,这叫一个进程. 机器里面实际上运行的都是线程. window等.linux等都是多进程,多线程的系统. CPU的执行是这样的: CPU速度比较快,一秒钟算好几亿次,它把自己的时间分成一个一个的小时间片,这个时间片我执行你一会,再执行他一会,虽然有几十个线程, 没关系,执行这个一会,执行那个一会,挨着排的都执行一遍,但是对

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就

线程的基本概念和操作

一:线程的基本概念 1.      调用run()方法 public class Demo1 { publicstatic void main(String[] args) { Thread1th1=new Thread1("线程A"); Thread1th2=new Thread1("线程B"); th1.run(); th2.run(); } } class Thread1 extends Thread{ privateString name; publicTh

java线程的基本概念

进程和线程 进程的诞生 操作系统中有2个任务A,B,任务A先执行,执行到一半需要io,因此要大量时间,在这个时间段内cpu是空闲的,浪费了资源,于是就有进程,当A暂时无法利用cpu,但是又不能销毁时,就把它暂存起来,让B来执行.B执行完或者需要A执行时,根据暂存的信息回复过来. 每个进程都对应一定的内存空间,并且只能使用自己的内存空间,并且保留程序的运行状态,这个也为进程切换提供了基础. 线程的诞生 第一,多核处理器的出现,为了更好的利用多核处理器,避免资源的浪费.第二程序的需要,人们需要在一个

Linux 下进程与线程的基本概念

2019-10-01 关键字:进程.线程.信号量.互斥锁 什么是程序? 程序就是存放在磁盘上的指令和数据的有序集合,就是源代码编译产物. 它是静态的. 什么是进程? 进程就是操作系统为执行某个程序所分配的资源的总称.进程是程序的一次执行过程,因此它与程序不同,它是动态的.它的生命周期包括创建.调度.执行和消亡. 进程的内容主要包括以下三个部分: 1.正文段: 2.用户数据段: 3.系统数据段. 其中正文段与用户数据段两部分是从程序当中来的.而系统数据段则是操作系统分配的用来管理这个进程用的. 系

有关进程和线程的小概念

# 1.线程与进程的区别是什么?(怎么理解怎么写)'''进程是程序运行的状态和过程.进程会占用内存中的一块空间,消耗资源.每个进程最少会有一个线程(主线程),可以有多个线程.pyyhon在运行的过程中最多只能有一个线程调用CPU资源,那是因为在每个进程前面有GIL全局解释器锁.多个线程通过全局解释器锁是靠操作系统分配的,同一时刻只能有一个线程获得CPU资源 ,如果该线程遇到IO操作,操作系统会将CPU分配给别的线程做运算,直到该线程IO操作结束继续计算.如果多线程计算过程调用了全局变量就需要注意

java多线程_01_线程的基本概念

线程:一个程序里边不同的执行路径 例子程序:这个例子程序是一条执行路径.这个程序只有一个分支,就是main方法,叫主线程 public static void main(String[] args) { m1(); } public static void m1(){ m2(); m3(); } public static void m2(){} public static void m3(){} 程序执行示意图: 进程:进程是一个静态的概念,机器上的一个class文件,一个exe文件. 程序的

线程,进程概念

当多个客户端访问服务端的时候,每个客户端都会对服务端说:’嗨,我想连接你‘.服务端的sorcket通过while循环,一直监听着是否有client请求连接,当有请求(一个或者多个)连接过来的时候:就会分配(一个或者多个)进程或者线程给client,并保持连接,进行通话. 线程是应用程序的最小单位, #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def show(arg): time.sleep(

线程的基本概念 / 计算机程序的思维逻辑

创建线程 线程表示一条单独的执行流,它有自己的程序执行计数器,有自己的栈.下面,我们通过创建线程来对线程建立一个直观感受,在Java中创建线程有两种方式,一种是继承Thread,另外一种是实现Runnable接口,我们先来看第一种. 继承Thread Java中java.lang.Thread这个类表示线程,一个类可以继承Thread并重写其run方法来实现一个线程,如下所示: public class HelloThread extends Thread {        @Override