Java多线程之线程的创建

好久没有更博客了,最近一直在忙工作的事情。现在终于空下来了,这2天会抓紧时间整理多线程和socket,把JavaSE结束掉。

关于多线程,首先会涉及到哪些东西呢?首先要了解线程,为什么要使用线程,线程有什么优势,线程和进程有什么区别呢?了解过大致的线程内容后,就应该编码来实现Java的多线程了。首先2种方式来创建线程类,然后调用对应的API来控制线程。然后还剩下一个最大的也是最重要的一块知识,就是线程同步。前面那些了解线程的生命周期就可以,实际编码中并不会多次写到那些编码,但是线程的同步经常要用到。同步代码块,同步方法,同步锁等等还是很重要的。最后就是一个线程池的问题了,这个了解下就好,在后面框架中有好多缓存技术使用了池技术的,我们也不需要编码了。

  • 线程和进程

实际开发中,特别是j2ee中,基本没有一个项目说是单线程的,都是多线程的。比如服务器处理多个请求。

  • 什么是进程?

几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,那么运行的这个程序就叫一个进程。进程的调度由OS负责(有的系统为独占式(Windows),有的系统为共享式(Unix),根据重要性,进程有优先级)。由OS 将时间分为若干个时间片。JAVA 在语言级支持多线程。分配时间的仍然是OS。

  • 什么是线程?

当一个程序运行时,内部可能包含了多个顺序执行流,那么这每一个顺序执行流就叫一个线程。

  • 关于他们2个之间的关系:

一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少要包含一个线程。

线程是一个操作系统创建并维护的一个资源,对操作系统来说JVM就是一个进程。

对于单个CPU系统来说,某一个时刻只可能由一个线程在运行。一个Thread对象就表示一个线程。

进程是独立的数据空间,线程是共享的数据空间。线程对象存在于虚拟机进程空间的一块连续的地址空间(静态的)。

  • 关于线程注意:

1.线程是动态的,与线程对象是两回事.

2.线程对象与其他对象不同的是线程对象能够到底层去申请管理一个线程资源。

3.只有对线程对象调用start()方法才是到底层去申请管理一个线程资源。

4.任务并发执行是一个宏观概念,微观上是串行的。

5.只有等到所有的线程全部结束之后,进程才退出。进行多线程编程时不要忘记了Java程序运行时默认的主线程,main方法的方法体就是主线程的线程执行体。

  • 在这里要注意2个概念上的区别:并行和并发。

并行指的是在同一时刻,有多条指令在多个处理器上同时执行。

并发指的是在同一时刻,只能有一条指令执行。但是多个指令被快速轮换执行,使得在宏观上有多个进程同时执行。也就是说只是看起来是同时执行的,其实具体实际执行的还是一条而已。

  • 多线程的优势:

1,进程间不能共享内存,但是线程之间共享内存非常容易。

2,系统创建进程需要为进程重新分配系统资源,但创建线程则代价小得多,使用多线程实现多任务并发比多进程的效率高。

3,Java语言内置多线程功能支持,而不是单纯的作为底层操作系统的调度方式,从而简化了Java的多线程编程

  • 线程的创建和启动

一共有2种方式:1,继承Thread类  2,实现Runnable接口。代码如下:

/**
 *
 * @version 1L
 * @author LinkinPark
 * @since 2015-2-3
 * @motto 梦似烟花心似水,同学少年不言情
 * @desc ^ 继承Thread,重写run方法。
 */
public class MyThread extends Thread
{
	private int i = 0;

	public void run()
	{
		for (; i < 10; i++)
		{
			//输出中i不连续,说明这种方式不能共享一份系统资源
			System.out.println(this.getName() + " " + i);
		}
	}

	public static void main(String[] args)
	{
		for (int i = 0; i < 100; i++)
		{
			//输出了主线程
			System.out.println(Thread.currentThread().getName() + " " + i);
			if (i == 20)
			{
				//这里开始抢占输出,注意的是i不连续
				new MyThread().start();
				new MyThread().start();
			}
		}
	}
}
public class MyThread1 implements Runnable
{
	private int i = 0;

	@Override
	public void run()
	{
		for (; i < 100; i++)
		{
			//输出中i连续,表明这种方式会共享同一份系统资源
			//这里没有Thread,所以只能通过这种方式:先返回当前正在执行的线程对象,然后在获得名字
			System.out.println(Thread.currentThread().getName() + " " + i);
		}
	}

	public static void main(String[] args)
	{
		for (int i = 0; i < 100; i++)
		{
			//输出主线程
			System.out.println(Thread.currentThread().getName() + " " + i);
			if (i == 20)
			{
				MyThread1 myThread1 = new MyThread1();
				//这里开始抢占输出,注意的是i连续
				new Thread(myThread1, "林肯的第一个线程").start();
				new Thread(myThread1, "林肯的第二个线程").start();
			}
		}
	}

}
  • 关于这2种方式创建线程的对比:

首先有必要看一下Thread类的run方法的源码。代码如下:

public void run() {
	if (target != null) {
	    target.run();
	}
    }

这里有一个target,如何理解这个target呢?run方法又叫线程执行体,我们可以这样子来理解,线程呢就是一段程序流,这段程序流要操作一个对象,那么操作的这个对象就是这个target,值得注意的一点是Java语言的Thread必须使用Runnable对象里面的run方法。

言归正传,这2种实现方式的区别如下:

1,实现Runnable接口,还可以继承其他的类。Java是单继承呀,要是直接去继承Thread类的话就不能再继承别的类了

2,实现Runnable接口,多个线程可以共享同一个target对象,所以非常适合多个相同的线程来处理同一份资源

3,实现Runnable接口,编码稍微有点多。访问当前线程只能使用Thread.currentThread(),要是继承Thread类的话直接使用this就可以获得当前的线程。

时间: 2024-10-10 01:16:43

Java多线程之线程的创建的相关文章

Java多线程之线程的同步

Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同一个数据时,非常容易出现线程安全问题.具体原因如下:   1,多个线程同时访问一个数据资源(该资源称为临界资源),形成数据发生不一致和不完整.   2,数据的不一致往往是因为一个线程中的多个关联的操作(这几个操作合成原子操作)未全部完成. 关于线程安全问题,有一个经典的情景:银行取钱.代码如下: /

Java多线程之线程的控制

Java多线程之线程的控制 线程中的7 种非常重要的状态:  初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dead 如果将"锁池"和"等待队列"都看成是"阻塞"状态的特殊情况,那么可以将线程归纳为5个状态: 新建,就绪,运行,阻塞,死亡. ┌--------------------< 阻塞 ↓                    (1)(2)(3)  

Java多线程之线程的通信

Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些线程中哪个线程拿到锁标记由系统决定.前面我们也有T到死锁的概念,线程互相等待其他线程释放锁标记,而又不释放自己的:造成无休止地等待.当出现死锁的时候,我们应该如何解决呢?通过线程间的通信解决. 线程间通信: 多线程之间的通信有2种方式,第一种是使用object类的几个方法,第二种是使用条件变了来控制

java 加入一个线程、创建有响应的用户界面 。 示例代码

javajava 加入一个线程.创建有响应的用户界面 . 示例代码 来自thinking in java 4 21章  部分代码  目录21.2.11 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.thread.concurrent; /** * 加入一个线程 * 一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行

Java多线程之线程结束清理

该事例说明了清理工作必须要放在finally块中 package Thread.Interrupting; import java.util.concurrent.TimeUnit; class NeedsCleanup { private final int id; public NeedsCleanup(int ident) { id = ident; System.out.println("NeedsCleanup " + id); } public void cleanup()

Java多线程之线程中断

该例子说明,Sleep可以被中断,但是I/O和synchronized不能被中断. package Thread.Interrupting; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; imp

java多线程之线程的同步与锁定(转)

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i

java多线程之 ---- 线程死锁

java多线程之线程死锁 产生死锁的主要原因: 因为系统资源不足. 进程运行推进的顺序不合适. 资源分配不当等. 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁.其次, 进程运行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件:  互斥条件:一个资源每次只能被一个进程使用. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. 循环等待条件:若干进

java多线程之 ---- 线程同步

java多线程之线程同步 线程同步 定义:同步是指在同一时间段内只能运行一个线程. 分类:同步方法.同步块. 作用:安全解决共享问题. 同步块: 语法: synchronized (同步对象) { 需要同步的代码; } 例子: public class ThreadDemo implements Runnable{ private int ticket = 5; public void run(){ for(int i=1;i<=5;i++){ synchronized (this){ if(t