一、怎么创建线程
(1)、第一种创建线程的方法
线程是由一个类表示的,叫Thread,当new出来一个Thread就是创建了一个线程。
//创建一个线程
Thread thread = new Thread(){
/**
* 此方法是编写执行线程时所需要执行的代码,是重写父类中的run()方法
*/
@Override
public void run() {
while (true) {
try {
//sleep(500)代表的是暂停线程多长时间之后在执行,里面的参数是毫秒单位
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//currentThread()代表的是当前线程,也就是当前对象
//getName()代表的是当前线程的名称
System.out.println(Thread.currentThread().getName());
//this.getName()这个意思和上面的一样,但是不建议这样写,因为当线程多的时候这个this就不知道代表的是那个对象了
//System.out.println(this.getName());
}
}
};
//运行线程
thread.start();
(2)、第二种创建线程的方法
这一种创建线程的方式是创建Runnable对象,创建这个对象时必须实现一个run()方法。
//第二种创建线程的方法,实现Runnable()方法,
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
//sleep(500)代表的是暂停线程多长时间之后在执行,里面的参数是毫秒单位
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//currentThread()代表的是当前线程,也就是当前对象
//getName()代表的是当前线程的名称
System.out.println(Thread.currentThread().getName());
//System.out.println(this.getName()); 这个时候就不能使用this方法了,因为使用this代表的就是Runnable()方法了 ,但Runnable不是一个线程所以不行
}
}
});
//打开第二个线程
thread2.start();
(3)、第三种出现的问题:
//第三种方法
//这里执行的是那个run方法,答案是Thread中的方法而不是Runnable中的,
//因为当子类覆盖父类的run方法时,此时的run方法时子类的而不是父类的,而Runnable是在父类中的run方法中在没有对象的时候创建的,
//当我们重写了父类方法之后就不会再去执行runable中的run方法了
new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
try {
//sleep(500)代表的是暂停线程多长时间之后在执行,里面的参数是毫秒单位
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Runnable +"+Thread.currentThread().getName());
}
}
}
){
public void run() {
while (true) {
try {
//sleep(500)代表的是暂停线程多长时间之后在执行,里面的参数是毫秒单位
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread +"+Thread.currentThread().getName());
}
}
}.start();
二、怎么实际运行线程
在Thread中有一个start()方法;这个方法就是运行此线程,当运行次线程的时候,就是在执行代码,这个代码就在Thread中的run()方法中编写。
通常我们都不会直接调用Thread方法,所以我们会使用子类继承Thread方法,然后用子类重写父类中的run()方法。
三、Thread和Runnable方法的区别?
Runnable方法更能体现面向对象的方式。
问题:
1、多线程机制会提高运行的效率吗?
答案是不会的,而且还会更慢,因为需要来回切换线程,所以会更慢。
有人说我多线程下载传输速度快,其实计算机并没有快,而是说抢了服务器的带宽,比如服务器会给每个服务提供20K那么10个线程服务器就会提供200K,所以不是机器快