`

多线程的几个小程序,诠释多线程的基本概念

阅读更多
通过实现Runnable来实现多线程:
public class TestThread1{
	public static void main(String[] args){
		Runner1 r = new Runner1();
		Thread t = new Thread(r);
		t.start();
//注意:t.run(); 是指方法调用,先执行Runner1()后,再往下执行。
		for(int i=200; i<300; i++){
			System.out.println("main--" + i);
		}
	}
}

class Runner1 implements Runnable{
	public void run(){
		for(int i=0; i<100; i++){
			System.out.println("Runner1--" + i);
		}
	}
}


public class Test1 implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("Thread: " + i );
			try {
				Thread.sleep((int)Math.random() * 200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}  
		}
	}
	
	public static void main(String[] args) {
		Test1 t1 = new Test1();
		Thread t_1 = new Thread(t1);
		t_1.setName("aaa");
		t_1.start();
		for (int i = 0; i < 10; i++) {
			System.out.println("main: " + i );
			try {
				Thread.sleep((int)Math.random() * 200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}  
		}
	}
}



通过继承Thread来实现多线程:
public class TestThread1{
	public static void main(String[] args){
		Runner1 r = new Runner1();
		r.start();
		for(int i=200; i<300; i++){
			System.out.println("main--" + i);
		}
	}
}

class Runner1 extends Thread{
	public void run(){
		for(int i=0; i<100; i++){
			System.out.println("Runner1--" + i);
		}
	}
}


注意:继承了Thread,那么不用再new Thread来起线程,直接用Runner1.start()即可

通过Thread.join()方法来等待当前线程走完
下面的程序,如果join了,那么n就等于1000

	public static volatile int n = 0;

	public void run() {
		for (int i = 0; i < 10; i++, n++)
			try {
				sleep(3); // 为了使运行结果更随机,延迟3毫秒
			} catch (Exception e) {
			}
	}

	public static void main(String[] args) throws Exception {
		Thread threads[] = new Thread[100];
		for (int i = 0; i < threads.length; i++)
			// 建立100个线程
			threads[i] = new Test4();
		for (int i = 0; i < threads.length; i++)
			// 运行刚才建立的100个线程
			threads[i].start();
		if (args.length > 0){
			for (int i = 0; i < threads.length; i++){
				// 100个线程都执行完后继续
				threads[i].join();
			}
		}
		System.out.println("n=" + Test4.n);
	}


在多线程中如何传递参数:
简单的是通过构造函数和set()来传值
复杂的是通过回调函数传值
下面的代码描述了回调传值的用法:
package com.mhm.test;

public class Test5 extends Thread {

	private Work work;

	
	public Test5(Work work) {
		this.work = work;
	}

	public void run() {
		java.util.Random random = new java.util.Random();
		Data data = new Data();
		int n1 = random.nextInt(1000);
		int n2 = random.nextInt(2000);
		int n3 = random.nextInt(3000);
		work.process(data, n1, n2, n3); // 使用回调函数
		System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value);
	}
	
	public static void main(String[] args) {
		Thread t1 = new Test5(new Work());
		Thread t2 = new Test5(new Work());
		Thread t3 = new Test5(new Work());
		
		t1.start();
		t2.start();
		t3.start();
	}
}

class Data {
	public int value = 0;
}

class Work {
	public void process(Data data, Integer... numbers) {
		for (int n : numbers) {
			data.value += n;
		}
	}
}


这个程序可能会输出"NULL":
因为线程可能还没有赋值就已经syso了。
解决办法是在start()后面加个join();
package com.mhm.test;

public class Test6 extends Thread {
	private String value1;
    private String value2;

    public void run()
    {
        value1 = "通过成员变量返回数据";
        value2 = "通过成员方法返回数据";
    }
    public static void main(String[] args) throws Exception
    {
    	Test6 thread = new Test6();
        thread.start();
        System.out.println("value1:" + thread.value1);
        System.out.println("value2:" + thread.value2);
    }
}

分享到:
评论

相关推荐

    易语言多线程多次启动一个子程序

    通过理解多线程的基本概念,掌握易语言中的线程创建和管理方法,以及注意线程安全和同步,你可以编写出高效且稳定的多线程程序。在实际开发中,不断实践和优化,将是提升多线程编程能力的关键。

    C#线程相关几个小程序

    标题 "C#线程相关几个小程序" 涉及到的是C#编程语言中的多线程技术,这是软件开发中非常关键的一个部分,特别是在需要同时处理多个任务或提高程序响应速度时。C#提供了丰富的线程支持,让我们来详细探讨一下相关知识...

    一个多线程下载程序

    标题 "一个多线程下载程序" 描述了一个使用VC++编程语言实现的软件,该软件能够通过多线程技术加速文件的下载过程。多线程下载是现代互联网应用程序中常见的优化技术,尤其对于大文件下载,它能显著提高下载速度,...

    易语言多线程传递多参数

    多线程是指一个程序内可以同时执行多个独立的执行流,每个执行流被称为一个线程。在易语言中,我们可以通过创建线程对象来实现多线程。线程间可以并行或交替执行,提高了程序的响应速度和资源利用率。在处理大量数据...

    C++多线程 最简易的多线程程序

    这个简易的实现为初学者提供了一个很好的起点,让大家了解多线程的基本概念和用法。 首先,要使用C++的多线程功能,我们需要包含`&lt;thread&gt;`头文件,并链接`stdc++fs`库。C++11引入了`std::thread`类,用于创建和...

    POSIX多线程程序设计.pdf

    本书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了一些高级话题,包括属性对象、线程私有数据和实时调度。此外,本书还讨论了调度的问题,并给出了避免错误和提高性能等问题的有...

    C++多线程网络聊天程序 .zip

    在聊天程序中,多线程的应用场景通常包括以下几个方面: 1. **接收线程**:这个线程负责从网络接收数据,例如,当用户在网络上的其他设备发送消息时,接收线程会持续监听网络连接,一旦接收到新数据,就将其解析并...

    多线程聊天程序多线程聊天程序多线程聊天程序

    1. **线程概念**:线程是操作系统分配CPU时间的基本单位,一个进程可以包含一个或多个线程。多线程意味着在一个程序中同时执行多个任务,可以显著提高CPU资源的利用率。 2. **线程同步与互斥**:在多线程环境中,...

    java多线程几个概念

    ### Java多线程几个核心概念 #### 一、理解多线程 多线程是一种让程序内部的不同任务或计算能够并发执行的技术。在Java中,多线程的应用极为广泛,可以大大提高程序的效率和响应性。多线程的核心概念包括以下几个...

    java多线程小汽车运行程序

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在这个名为"java多线程小汽车运行程序"的项目中,我们可以看到一个利用Java实现的多线程应用程序,可能是模拟汽车...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。以下是这些实例可能涉及的关键知识点: 1. **线程创建**:C#中创建线程主要有两种方式,一是通过`System.Threading.Thread`...

    一个多线程同步读写的小程序

    在这个“一个多线程同步读写的小程序”中,我们看到开发者尝试通过创建读线程和写线程来同时进行数据的读取和写入,以优化程序的执行流程。 首先,让我们深入理解多线程的概念。线程是操作系统分配处理器时间的基本...

    操作系统 多线程演示程序

    在本案例中,"操作系统 多线程演示程序" 是一个基于VC++的可视化应用,用于模拟多线程间的信号量传递,以帮助理解多线程编程的基本原理和实践。 多线程的概念源于并发性,它允许多个任务或子任务并行执行,提高了...

    使用三种VC的多线程同步方法编写一个多线程的程序

    1.使用三种VC的多线程同步方法编写一个多线程的程序(要求在屏幕上先显示Hello,再显示World)。 1)基于全局变量的多线程同步程序; 2)基于事件的多线程同步程序; 3)基于临界区的多线程同步程序。

    POSIX多线程程序设计

    在深入探索 POSIX 多线程程序设计之前,我们需要了解POSIX(可移植操作系统接口)是一个定义一系列UNIX系统服务的接口标准,这些服务包括文件处理、进程控制、信号处理、定时器、多线程等,POSIX标准让编写的应用...

    深入浅出 Java 多线程.pdf

    Java 多线程编程是 Java 编程语言中一个非常重要的概念,它允许程序同时执行多个任务,以提高程序的执行效率和响应速度。在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的...

    C#多线程互斥实例 多线程获取同一变量

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...

    多线程_按键精灵经典多线程操作_

    在IT行业中,多线程是一种常见的编程技术,它允许程序同时执行多个独立的任务,从而提高计算机系统的效率和响应性。特别是在自动化工具如“按键精灵”中,多线程的应用能够显著提升其性能和实用性。 标题“多线程_...

    Win32 多线程程序设计完全手册PDF,本书详细讲解了多线程程序设计。

    本书首先会介绍多线程的基本概念,包括线程的创建、销毁以及线程间的通信。线程创建通常通过调用CreateThread函数实现,而销毁则涉及TerminateThread或退出线程的主循环。线程间通信是多线程程序中的重要部分,可以...

Global site tag (gtag.js) - Google Analytics