线程Thread(JAVA) 篇一

概念粗解

谈到线程,必谈进程。那么何为进程?
进程直译为:系统中正在运行中的程序。
知道了进程,接下来谈谈线程。
其实线程就是进程中一个负责执行程序的控制单元,即线程是进程的一个特定执行路径。
多线程则就是一个进程中可以条执行路径。
多线程的意义就是为了能够同时运行多部分代码,并且每个线程都有自己需要运行的内容,这些内容称之为线程要执行的任务。
多线程的利弊
    利:解决了多部分同时运行的问题。
    弊:线程太多会导致效率的降低。
其实应用程序中的的多线程执行都是CPU在做快速的切换完成的,这个切换是算法调度的。有兴趣可以参考浅谈关于多线程在CPU上是怎样分布的了解。

JVM中的多线程解析

JVM启动的时候就启动了多个线程,最明显的是主线程和垃圾回收线程。
主线程:执行main函数的线程
             
 该线程的任务代码都定义在main函数中。
垃圾回收线程:负责垃圾回收的线程

class Demo extends Object
{
     /*垃圾回收方法 
     当垃圾回收器确定不存在对该对象的更多引用时
     由对象的垃圾回收器调用此方法
     */
 	public void finalize() 
 	{
 		System.out.println("demo ok");
 	}
}
public class ThreadDemo
{
 	public static void main(String[] args)
 	{
 		new Demo();
 		new Demo();
 		System.gc();//运动垃圾回收器
 		new Demo();
 		System.out.println("hello thread");
 	}
}

     详细关于JVM垃圾回收器可参考
Jvm垃圾回收器(终结篇)
当程序都在主线程执行时:则可看出程序是按照从上到下的顺序依次执行完成。

class Demo
{
	private String name;
	Demo(String name)
	{ 
		this.name = name;
	}
	public void show()
	{
		for(int i = 0; i < 5; i++)
		{
			for(int j=-99999999; j<999999999; j++) {}
			//Thread.currentThread().getName() 获取当前线程名
			System.out.println(name+" : "+ i + "..." + Thread.currentThread().getName());
		}
	}
}
public class ThreadDemo
{
	public static void main(String[] args)
	{
		Demo demo1 = new Demo("旺财");
		Demo demo2 = new Demo("xiaoqiang");
		
		demo1.show();
		demo2.show();
	}
}

则可得到执行结果:

旺财 : 0…main
旺财 : 1…main
旺财 : 2…main
旺财 : 3…main
旺财 : 4…main
xiaoqiang : 0…main
xiaoqiang : 1…main
xiaoqiang : 2…main
xiaoqiang : 3…main
xiaoqiang : 4…main

    从执行结果则可看出来代码是按照从上到下的顺序执行,并且都是在主线程。
怎么开启其他线程呢???
     通过java API 文档 java.lang包里面找到Thread类,此类为线程类,可以进行参考。
为什么要去开启其他线程呢???
    开启线程的目的是为了开启其他的执行路径,这些路径用于运行指定的代码,以实现代码同时运行的效果。每个执行路径所运行的代码就是这个路径的任务。

创建一个新的执行线程有两种方法
创建线程方式一

  1. 定义一个类继承Thread类
  2. 覆盖Thread类中的run方法
  3. 直接创建Thread类的子类对象创建线程
  4. 调用start方法开启线程并调用线程的任务run方法执。

JVM创建的主线程的任务都定义在主函数。从上面代码运行可以看出。
那么,自定义线程的任务会在哪里呢???
     Thread类用于描述线程,线程是需要任务的。所以Thread类也有对任务的描述。这个任务就是通过Thread类中的run方法来体现的,也就是说:run方法就是封装自定义线程运行任务的函数,run方法中的代码就是线程要运行的任务代码。

将上面的代码进行修改 让其在其他线程执行

/**
* 开启线程是为了运行指定的代码,所以只要继承Thread类,并复写run方法,
* 并将运行的代码定义在run方法中即可
*/
class Demo extends Thread
{
   	private String name;
   	Demo(String name)
   	{ 
   		this.name = name;
   	}
   	public void run()
   	{
   		for(int i = 0; i < 5; i++)
   		{
   			for(int j=-99999999; j<999999999; j++) {}
   			System.out.println(name+" : "+ i + "..." + Thread.currentThread().getName());
   		}
   	}
}
public class ThreadDemo
{
   	public static void main(String[] args)
   	{
   	 	
   		Demo demo1 = new Demo("旺财");
   		Demo demo2 = new Demo("xiaoqiang");
   		/*开启线程,切记不是调用run()方法。run()方法是通过start()方法开启现成后,自动调用执行的。*/
   		demo1.start();
   		demo2.start();
   	}
}

则可得到执行结果:

xiaoqiang : 0…Thread-1
xiaoqiang : 1…Thread-1
旺财 : 0…Thread-0
旺财 : 1…Thread-0
旺财 : 2…Thread-0
旺财 : 3…Thread-0
旺财 : 4…Thread-0
xiaoqiang : 2…Thread-1
xiaoqiang : 3…Thread-1
xiaoqiang : 4…Thread-1

注意:也可能是其他运行结果,这是两个线程同时打印的结果,不是出现什么错误了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值