线程总结(一)

线程:是程序的不同执行路径

一般操作系统支持多线程,多进程。dos支持单进程。

一个cpu,实质上只能支持一个线程执行,只是cpu运行速度快,看起来像是多线程。如果是双cpu或双核,可以执行多进程。

java中的线程是由java.lang.Thread类实现的


/**
*
*程序功能:创建线程方法一(常用方法)
* @author Administrator
*/
public class Test {
//
public static void main(String[] args) {
// TODO Auto-generated constructor stub
Run r=new Run();
//通过Thread的实例化创建新的线程
Thread t=new Thread(r);
//启动线程,自动执行重写的run()方法
t.start();

//虚拟机启动时会自动创建一个有主方法定义的线程主线程。
//主线程调用的方法
for(int i=0;i<100;i++){
System.out.println("Main Thread"+i);

}

}

}

//通过实现Runnable接口来重写run()方法
class Run implements Runnable{

//启动新创建的线程时调用的方法
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<100;i++){
System.out.println("new Thread"+i);

}

}

}


/**
*
*程序功能:调用方法
* @author Administrator
*/
public class Test2 {

public static void main(String[] args) {
// TODO Auto-generated constructor stub
Run r=new Run();
//方法调用
r.run();
//Thread t=new Thread(r);
//t.start();

for(int i=0;i<100;i++){
System.out.println("Main Thread"+i);

}

}

}

class Run implements Runnable{

public void run() {
// TODO Auto-generated method stub
for(int i=0;i<100;i++){
System.out.println("new Thread"+i);

}

}

}

创建线程与方法调用区别

创建线程前,执行main方法中的语句,创建线程后,main方法未执行的语句与

创建线程后自动调用的语句并行执行,直到两者都执行完毕

方法调用前,执行main方法中的语句,执行到方法调用时,先停止执行main方法,执行调用的方法,当调用的方法执行完后,再继续执行main方法中还未执行的语句


/**
*
*程序功能:创建线程方法二
* @author Administrator
*/

public class Test2{
public static void main(String[] args){
Run t=new Run();
t.start();

for(int i=0;i<10;i++){
System.out.println("主线程"+i);
}

}
}

class Run extends Thread{
public void run(){
for(int i=0;i<10;i++)
System.out.println("新线程");
}
}

一般用方法一创建线程。因为java中的类只能继承一个类,但是可以实现很多接口

Thread类常用方法:

public static void sleep(long mills)throws InterruptedException:

使当前进程休眠(暂时停止执行mills毫秒)

在哪个线程里调用sleep方法,哪个线程陷入睡眠状态

void stop():已过时,在需要杀死线程时使用

void interrupt():中断线程


import java.util.Date;
/**
*
*程序功能:不太合理的停止新建线程方法
* @author Administrator
*/

public class Test {

public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t=new Thread(new Runner());
t.start();
try {
//主线程睡眠10s
t.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//强制打断线程运行,引发Runner类中异常
t.interrupt();
}

}

class Runner implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
Thread t=new Thread();
while(true){
System.out.println("---"+new Date()+"---");
try {
//睡眠1s
t.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
return;
}
}

}

}


/**
*
*程序功能:停止创建的线程
* @author Administrator
*/

import java.util.*;
public class Test2 {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
try {Thread.sleep(10000);}
catch (InterruptedException e) {}
thread.flag=false;
}
}

class MyThread extends Thread {
boolean flag = true;
public void run(){
while(flag){
System.out.println("==="+new Date()+"===");
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
}
}
}


import java.util.Date;

public class Test {
public static void main(String[] args) {
Runner r=new Runner();
Thread t=new Thread(r);
t.start();
for(int i=0;i<10;i++){
System.out.println("主线程"+i);
}

r.shutDown();
}
}

class Runner implements Runnable{
boolean flag=true;
public void run(){
int i=0;
while(flag){
System.out.println("新线程"+i++);

}
}
public void shutDown(){
flag=false;
}
}

void join():合并某个线程,相当于方法调用


public class Test {
public static void main(String[] args) {
MyThread2 t1 = new MyThread2("abcde");
t1.start();
try {
t1.join();
} catch (InterruptedException e) {}

for(int i=1;i<=10;i++){
System.out.println("i am main thread");
}
}
}
class MyThread2 extends Thread {
MyThread2(String s){
super(s);
}

public void run(){
for(int i =1;i<=10;i++){
System.out.println("i am "+getName());
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
}
}
}

public static void yield():暂停当前正在执行的线程对象,并执行其他线程。 


public class TestYield {
public static void main(String[] args) {
MyThread3 t1 = new MyThread3("t1");
MyThread3 t2 = new MyThread3("t2");
t1.start(); t2.start();
}
}
class MyThread3 extends Thread {
MyThread3(String s){super(s);}
public void run(){
for(int i =1;i<=100;i++){
System.out.println(getName()+": "+i);
if(i%10==0){
yield();
}
}
}
}

线程优先级越高,得到的cpu执行时间片越多

线程优先级范围:1-10(默认为5)

public static final int MAX_PRIORITY:最高优先级。
public static final int NORM_PRIORITY:默认优先级
public static final int MIN_PRIORITY:最低优先级
public final int getPriority():返回线程的优先级
public final void setPriority(int newPriority):更改线程的优先级


public class TestPriority {
public static void main(String[] args) {
Thread t1 = new Thread(new T1());
Thread t2 = new Thread(new T2());
t1.setPriority(Thread.NORM_PRIORITY + 3);
t1.start();
t2.start();
}
}

class T1 implements Runnable {
public void run() {
for(int i=0; i<1000; i++) {
System.out.println("T1: " + i);
}
}
}

class T2 implements Runnable {
public void run() {
for(int i=0; i<1000; i++) {
System.out.println("------T2: " + i);
}
}
}

线程总结(一)

时间: 2024-10-14 12:03:30

线程总结(一)的相关文章

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

201709018工作日记--线程状态的转换

先来张图: 线程在一定条件下,状态会发生变化: 1.新建状态(New):新创建了一个线程对象 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种:   (一).等

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

线程的控制和线程池

一.WaitHandle: ”.Net 中提供了一些线程间更自由通讯的工具,他们提供了通过"信号"进行通讯的机制 可以通过ManualResetEvent,AutoResetEvent(他是在开门并且一个 WaitOne 通过后自动关门)来进行线程间的通讯 waitOne:    等待开门 Set:           开门 Reset:       关门 static void Main(string[] args) { ManualResetEvent mre = new Manu

内存池、进程池、线程池

首先介绍一个概念"池化技术 ".池化技术 一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用. 池化技术应用广泛,如内存池,线程池,连接池等等.内存池相关的内容,建议看看Apache.Nginx等开源web服务器的内存池实现. 起因:由于在实际应用当中,分配内存.创建进程.线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作.           因此,当程序中需要频繁的进行内存申请释放,进程.线程创建销毁等操作时,通常会使用内存池.进程池.

线程高级

例题,哲学家用餐: 在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜. 示意图:  设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起.放下两个方法:当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子. 代码示例:  接着设计哲学家类,

缓冲池,线程池,连接池

SSH:[email protected]:unbelievableme/object-pool.git   HTTPS:https://github.com/unbelievableme/object-pool.git 缓冲池 设计要点:包含三个队列:空缓冲队列(emq),装满输入数据的输入的队列(inq),装满输出数据的输出队列(outq),输入程序包括收容输入(hin),提取输入(sin),输出程序包括收容输出(hout)和提取输出(sout). 注意点:输入程序和输出程序会对缓冲区并发访

能够在子线程绘画的View SurfaceView

转载请注明出处:王亟亟的大牛之路 近期两天都没有写文章,一方面是自己在看书.一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好Gradle我也是无语了(FQ也没用).准备今天背着笔记本 回家搞.真是服了.. 抱怨的话不说了,来看下这一篇要讲的主角 SurfaceView,关于SurfaceView的文章事实上在别的一些网站上也有,由于我之前没写过,所以也就一直没整这部分的内容(别人写的好坏反正找好的点自己吸收吧,嘿嘿) 问题:Surf

java线程安全问题之静态变量、实例变量、局部变量

Java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如:"一个类在可以被多个线程安全调用时就是线程安全的". 此处不赘述了,首先给出静态变量.实例变量.局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟! 静态变量:线程非安全. 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态