启用一个新的线程

public class TestThread1 {
	public static void main(String[] args) {
		Runner1 r = new Runner1();
<span style="white-space:pre">		</span>//	r.run();					//这个地方不属于启用新线程,属于方法调用
		Thread t = new Thread(r);
		t.start();						//启用一个新的线程的时候,必须用Thread下的start方法

		for(int i=0;i<100;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);
		}
	}
}

/*

在JDK文档中,对类Thread的方法start()的描述如下:

public void start()
使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 

结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。 

多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。 

*/

对于启用一个新线程,还有一种方法,是继承Thread类:

public class TestThread1 {
	public static void main(String[] args) {
		Runner1 r = new Runner1();
		r.start();<span style="white-space:pre">		</span>//因为是从Thread类继承的,所以也可以直接使用继承过来的start()方法
//<span style="white-space:pre">	</span>	r.run();					//这个地方不属于启用新线程,属于方法调用
//		Thread t = new Thread(r);
//		t.start();						//启用一个新的线程的时候,必须用Thread下的start方法

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

不推荐使用继承,因为继承只能单继承,但是接口可以实现多继承,所以在java中,能实现接口完成的尽量用接口,不用继承

时间: 2024-10-29 19:05:44

启用一个新的线程的相关文章

Java-开启一个新的线程

java实现多线程有2种方法:1扩展java.lang.Thread类:2实现java.lang.Runnable接口 下面举个例子,实现Runnable,来实现多线程 public class DoSomething implements Runnable { //实现Runnable接口 public void run() { // 实现run方法 for (int i = 0; i < 5; i++) { // 重复5次 System.out.println("次线程do somet

Java多线程-新特性-线程池

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要. 有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程.目前有关这方面的资料和书籍都少之又少,大部分介绍线程方面书籍还停留在java5之前的知识层面上. 在Java5之

《一个 Go 程序系统线程暴涨的问题》结论

原文地址:https://zhuanlan.zhihu.com/p/22474724 作者的结论没写好,我来说两句.. 结论: Docker swarm自己有个函数,叫setTcpUserTimeout,这个函数调用了conn.File()方法,将tcp的fd变成了blocking,而且没有关闭对应的fd.相当于每次设定tcpUserTimeout参数,再去read一下fd,都会产生一个新的线程.因为老的线程在读fd,而fd被设置成blocking了,于是golang的运行时只好再开一个新的.

Golang 简单的启用一个线程

// code by shaoyongyang package main import (     "fmt"     "time" ) func say(s string) {     fmt.Println(s) } func main() {     go say("who are you?")     go say("who are you?1")     fmt.Println(2)     time.Sleep(1

(Facebook开源项目)Fresco:一个新的Android图像处理类库

在Facebook的Android客户端上快速高效的显示图片是非常重要的.然而多年来,我们遇到了很多如何高效存储图片的问题.图片太大,而设备太小.一个像素点就占据了4个字节数据(分别代表R G B和alpha).如果在一个480*800尺寸的手机屏幕上,一张单独的全屏图片就会占据1.5MB的内存空间.通常手机的内存都非常小,而这些内存被多种多样的app划分占用.在一些设备上,Facebook app虽然只有16MB,但是仅仅一个图片就占用了1/10的空间. 当你的app用完你的内存时会发生什么呢

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

第六周分析Linux内核创建一个新进程的过程

潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  unsigned int rt_priority;实时优先级  unsigned int policy;调度策略  struct files

分析Linux内核创建一个新进程的过程

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

C#中关闭第一个Form窗口,打开另一个新窗口方法

很多同学问怎么关闭一个FORM打开另一个新Form.这个问题最多的是在做登录验证时,使用第一个登录窗 登录成功后要关闭自己,然后打开新窗显示.没想到这个问题在.Net还成了问题,不过依然有很多方法解决. 典型的 Form1 f = new Form1(); f.Show(); this.Close(); 最后的关闭时把整个程序都关闭了 1隐藏法,原理就是把旧窗口隐藏掉,再打开新窗口. //新建一个NewForm窗口(NewForm是自己定义的Form) NewForm fm=new NewFor