先介绍一下线程和进程的概念吧
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,即进程空间或(虚空间)。进程不依赖于线程而独立存在,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
说的这么多,我来总结下自己的看法吧,最不喜欢长篇大论
进程就是一个exe,例如迅雷软件,运行起来就是一个进程
多个线程组成进程,线程之间可以并发
例如,迅雷的多个下载任务就可理解成多个线程,他们之间是并发的
那么,下面我们由浅入深
首先我们看一个案例,
【案例1】:编写一个程序,每隔一秒输出helloworld,用线程实现
直接上代码
public class Main
{
public static void main(String[] args)
{
Cat c = new Cat();
c.start(); //直接start就行
}
}
class Cat extends Thread //继承Thread类
{
public void run()
{
while( true )
{
int cnt = 0;
try
{
Thread.sleep(1000); //有sleep就要有try catch
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Hello World");
}
}
}
那么我们如果不继承,能不能用接口呢?
答案是可以的,因为Java不支持多继承,所以用接口写还是有好处的
下面是代码
public class Main
{
public static void main(String[] args)
{
Cat c = new Cat();
Thread t = new Thread(c);
t.start();
}
}
class Cat implements Runnable //用 Runnable接口
{
public void run()
{
while( true )
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Hello World");
}
}
}
以上就是单线程的编写啦,很简单,但是大家一定要自己敲一下
下面开始慢慢讲多线程
我们再看一个案例
【案例2】:编写一个程序,接受一个整数n,创建两个线程,一个线程计算1+2+*****+n,并输出结果,另一个线程每隔一秒在控制台输出,“我是线程,第**个helloworld”,两个工作要同时进行
import java.lang.reflect.Array;
import java.math.*;
import java.util.*;
import java.io.*;
public class Main
{
public static void main(String[] args)
{
Calculate cal = new Calculate(4);
Print print = new Print(4);
Thread thread1 = new Thread(cal);
Thread thread2 = new Thread(print);
thread1.start(); //启动
thread2.start();
}
}
class Calculate implements Runnable
{
int n;
public Calculate( int n )
{
this.n = n;
}
public void run()
{
int ans = 0;
int t = 0;
while( true )
{
try
{
Thread.sleep(1000);
}
catch( Exception e )
{
e.printStackTrace();
}
t++;
ans += t;
System.out.println("当前结果是"+ans);
if( t == n )
{
System.out.println("最终结果是"+ans);
break;
}
}
}
}
class Print implements Runnable
{
int n; //输出n遍
public Print( int n )
{
this.n = n;
}
public void run()
{
// TODO Auto-generated method stub
int cnt = 0;
while( true )
{
try
{
Thread.sleep(1000);
}
catch( Exception e )
{
e.printStackTrace();
}
System.out.println("我是一个线程,真正输出helloworld"+cnt);
cnt++;
if( cnt == n )
break;
}
}
}
本文章参考韩老师的视频,推荐一下: